Localeconv: примеры (PHP)

Работа с localeconv в PHP для локализации чисел
Раздел: Интернационализация
localeconv: array
Описание функции localeconv

Функция localeconv возвращает ассоциативный массив с данными о числовых и денежных форматированиях для текущей или указанной локали. Она используется при разработке интернационализированных приложений для корректного отображения чисел, валют и других локале-зависимых форматов.

Когда применяется

Функция находит применение при форматировании цен, отображении десятичных разделителей, группировке разрядов чисел в финансовых системах, электронной коммерции и мультиязычных проектах.

Аргументы функции

Функция не принимает параметров. Она работает с текущей локалью, установленной с помощью setlocale().

Простые примеры использования
Базовый пример с русской локалью
<?php
setlocale(LC_ALL, 'ru_RU.UTF-8');
$locale_info = localeconv();
print_r($locale_info);
?>
Array
(
    [decimal_point] => .
    [thousands_sep] => 
    [int_curr_symbol] => RUB 
    [currency_symbol] => ₽
    [mon_decimal_point] => ,
    [mon_thousands_sep] => 
    [positive_sign] => 
    [negative_sign] => -
    [int_frac_digits] => 2
    [frac_digits] => 2
    [p_cs_precedes] => 0
    [p_sep_by_space] => 1
    [n_cs_precedes] => 0
    [n_sep_by_space] => 1
    [p_sign_posn] => 3
    [n_sign_posn] => 3
    [grouping] => Array
        (
            [0] => 3
        )
    [mon_grouping] => Array
        (
            [0] => 3
        )
)
Пример с американской локалью
<?php
setlocale(LC_ALL, 'en_US.UTF-8');
$info = localeconv();
echo $info['decimal_point']; // Точка как разделитель дробной части
echo $info['currency_symbol']; // Символ доллара
?>
.
$
Похожие функции в PHP

NumberFormatter (класс из расширения intl) - предоставляет более мощные возможности форматирования чисел, валют и процентов с поддержкой ICU. Рекомендуется для сложных сценариев.

money_format - функция для форматирования денежных значений (устарела в PHP 7.4, удалена в PHP 8.0).

number_format - форматирует число с группировкой разрядов и заданными разделителями. Проще для базовых задач.

Аналоги в других языках
Python: locale.localeconv()
import locale
locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8')
print(locale.localeconv()['decimal_point'])
.
JavaScript: Intl.NumberFormat
const formatter = new Intl.NumberFormat('ru-RU');
console.log(formatter.format(1234.5)); // "1 234,5"
1 234,5
MySQL: FORMAT()
SELECT FORMAT(1234.567, 2, 'ru_RU');
1 234,57
Типичные ошибки
Неустановленная локаль
<?php
// setlocale не вызыван, используется локаль по умолчанию C
$data = localeconv();
echo $data['decimal_point']; // Точка
?>
.
Неподдерживаемая локаль
<?php
if (setlocale(LC_ALL, 'invalid_locale') === false) {
    echo 'Локаль не установлена';
}
?>
Локаль не установлена
Изменения в версиях PHP

В PHP 8.0 функция localeconv была перенесена в стандартное расширение intl, но осталась доступной без необходимости явной загрузки расширения. Поведение функции не изменялось с PHP 5.3.

Расширенные примеры
Динамическое форматирование чисел
Пример php
<?php
setlocale(LC_ALL, 'de_DE.UTF-8');
$lc = localeconv();
$number = 1234567.89;
$formatted = number_format(
    $number,
    2,
    $lc['decimal_point'],
    $lc['thousands_sep']
);
echo $formatted; // Немецкий формат
?>
1.234.567,89
Форматирование валют с учетом знака
Пример php
<?php
setlocale(LC_ALL, 'fr_FR.UTF-8');
$lc = localeconv();
$amount = -1234.56;
$format = "%s%s%s";
if ($amount >= 0) {
    $result = sprintf($format,
        $lc['p_cs_precedes'] ? $lc['currency_symbol'] : '',
        abs($amount),
        !$lc['p_cs_precedes'] ? $lc['currency_symbol'] : ''
    );
} else {
    $result = sprintf($format,
        $lc['n_cs_precedes'] ? $lc['currency_symbol'] : '',
        abs($amount),
        !$lc['n_cs_precedes'] ? $lc['currency_symbol'] : ''
    );
}
echo $result;
?>
1234,56€
Использование с пользовательской локалью
Пример php
<?php
setlocale(LC_MONETARY, 'en_GB.UTF-8');
$info = localeconv();
// Проверка группировки разрядов для денежных значений
print_r($info['mon_grouping']);
?>
Array
(
    [0] => 3
)

PHP localeconv function comments

En
Localeconv Get numeric formatting information