localeconv()
Статья о PHP-функции localeconv(), которая возвращает информацию о форматировании чисел и валюты для текущей локали.
PHP-функция localeconv() возвращает ассоциативный массив, описывающий правила форматирования чисел и валюты в текущей активной локали — какой десятичный разделитель использовать, какой разделитель тысяч, символ валюты, расположение символа и знака и т.д. Она читает локаль, последней установленную с помощью setlocale(), и является мостом между понятиями «какая у меня локаль» и «каковы правила форматирования».
На этой странице рассматриваются синтаксис, все ключи возвращаемого массива, запускаемый пример и типичная ошибка, с которой сталкивается большинство разработчиков: в локали по умолчанию большинство значений оказываются пустыми.
Синтаксис
localeconv(): arraylocaleconv() не принимает никаких аргументов и всегда возвращает массив. У неё нет режима сбоя — передавать нечего, и она никогда не возвращает false.
Базовый пример
Обратите внимание на вызов setlocale() в первой строке. Без него скрипт работает в локали C по умолчанию, где большинство денежных полей возвращаются пустыми — см. раздел об ошибке ниже.
Возвращаемый массив
localeconv() возвращает следующие ключи. Обычные ключи (decimal_point, thousands_sep) применяются к обычным числам; ключи mon_* применяются исключительно к денежным значениям.
| Ключ | Значение |
|---|---|
decimal_point | Десятичный разделитель для не-денежных чисел (например, .) |
thousands_sep | Разделитель тысяч для не-денежных чисел (например, ,) |
grouping | Массив, описывающий группировку цифр, например [3] = группы по 3 |
int_curr_symbol | Международный символ валюты, например USD |
currency_symbol | Локальный символ валюты, например $ |
mon_decimal_point | Десятичный разделитель для денежных значений |
mon_thousands_sep | Разделитель тысяч для денежных значений |
mon_grouping | Группировка цифр для денежных значений |
positive_sign / negative_sign | Строки знака для положительных / отрицательных значений |
int_frac_digits / frac_digits | Количество дробных цифр (международный / локальный) |
p_cs_precedes / n_cs_precedes | 1 если символ валюты предшествует положительному / отрицательному значению, 0 если следует за ним |
p_sep_by_space / n_sep_by_space | 1 если пробел разделяет символ и значение |
p_sign_posn / n_sign_posn | Расположение знака относительно значения и символа |
Чтобы просмотреть весь массив сразу, используйте print_r():
<?php
setlocale(LC_ALL, 'en_US.UTF-8');
print_r(localeconv());
?>Для системы с en_US.UTF-8 это выводит (в сокращённом виде):
Array
(
[decimal_point] => .
[thousands_sep] => ,
[int_curr_symbol] => USD
[currency_symbol] => $
[frac_digits] => 2
[p_cs_precedes] => 1
[grouping] => Array ( [0] => 3 )
...
)Типичная ошибка: локаль по умолчанию возвращает пустые значения
До вызова localeconv() PHP работает в локали C, если вы её не задали. В локали C почти каждое денежное поле пустое, а поля с количеством цифр равны 127 (маркер стандарта C «значение недоступно»):
<?php
// No setlocale() — default C locale.
$info = localeconv();
var_dump($info['currency_symbol']); // string(0) ""
var_dump($info['frac_digits']); // int(127)
?>Если localeconv() «возвращает ничего полезного», вы почти наверняка забыли предварительно вызвать setlocale(). Задайте локаль явно и учтите, что доступные локали зависят от операционной системы, на которой выполняется скрипт.
Когда это использовать?
Напрямую вызывать localeconv() для форматирования вывода приходится редко — для этого служат number_format() и класс NumberFormatter из расширения intl. Функция наиболее полезна, когда нужны сырые правила локали, например чтобы:
- построить собственный форматтер, учитывающий локаль пользователя,
- нормализовать пользовательский ввод (зная, использует ли
1.234,56запятую или точку в качестве десятичного разделителя), - определить, должен ли символ валюты стоять до или после суммы.
Связанные функции
setlocale()— устанавливает локаль, из которой читаетlocaleconv().number_format()— форматирует число с группировкой тысяч.money_format()— форматирование валюты с учётом локали (удалено в PHP 8.0).strftime()— форматирование даты/времени с учётом локали.