W3docs

localeconv()

Статья о PHP-функции localeconv(), которая возвращает информацию о форматировании чисел и валюты для текущей локали.

PHP-функция localeconv() возвращает ассоциативный массив, описывающий правила форматирования чисел и валюты в текущей активной локали — какой десятичный разделитель использовать, какой разделитель тысяч, символ валюты, расположение символа и знака и т.д. Она читает локаль, последней установленную с помощью setlocale(), и является мостом между понятиями «какая у меня локаль» и «каковы правила форматирования».

На этой странице рассматриваются синтаксис, все ключи возвращаемого массива, запускаемый пример и типичная ошибка, с которой сталкивается большинство разработчиков: в локали по умолчанию большинство значений оказываются пустыми.

Синтаксис

localeconv(): array

localeconv() не принимает никаких аргументов и всегда возвращает массив. У неё нет режима сбоя — передавать нечего, и она никогда не возвращает false.

Базовый пример

php— editable, runs on the server

Обратите внимание на вызов 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_precedes1 если символ валюты предшествует положительному / отрицательному значению, 0 если следует за ним
p_sep_by_space / n_sep_by_space1 если пробел разделяет символ и значение
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() — форматирование даты/времени с учётом локали.

Практика

Практика
Что делает функция localeconv() в PHP?
Что делает функция localeconv() в PHP?
Was this page helpful?