PHP: формат чисел с учетом локали

Я хочу отформатировать номер 3253454 для посетителей моего сайта.

Если я использую встроенную функцию number_format, я получаю: 3,253,454, что отлично подходит для Великобритании и США, однако в большинстве других стран используется 3,253,454

У меня много иностранных посетителей.

Может ли кто-нибудь дать мне указатель на лучшую практику здесь?

В идеале я хочу получить языковой стандарт браузера и соответствующим образом отформатировать номер. Возможно ли это вообще в PHP?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
22
0
26 189
7

Ответы 7

string number_format (float $number, int $decimals, string $dec_point, string $thousands_sep)

см. php doku для number_format

Еще одна полезная ссылка может быть Zend_Locale от Zend Framework - она ​​может определять язык вашего пользователя, а также помогать с форматированием чисел / валют.

От http://us3.php.net/manual/en/function.number-format.php#76448:

<?php

    function strtonumber( $str, $dec_point=null, $thousands_sep=null )
    {
        if ( is_null($dec_point) || is_null($thousands_sep) ) {
            $locale = localeconv();
            if ( is_null($dec_point) ) {
                $dec_point = $locale['decimal_point'];
            }
            if ( is_null($thousands_sep) ) {
                $thousands_sep = $locale['thousands_sep'];
            }
        }
        $number = (float) str_replace($dec_point, '.', str_replace($thousands_sep, '', $str));
        if ( $number == (int) $number ) {
            return (int) $number;
        } else {
            return $number;
        }
    }

?>

Кажется, это именно то, что вы ищете. :)

Вы можете использовать серверную переменную HTTP_ACCEPT_LANGUAGE, чтобы угадать их локаль и ожидаемый числовой формат.

Если бы я реализовал это, я бы позволил пользователю установить предпочтение, чтобы переопределить предполагаемое, и моя функция выглядела бы так:

function number_format_locale($number,$decimals=2) {
    $locale = ( isset($_COOKIE['locale']) ? 
                    $_COOKIE['locale'] : 
                    $_SERVER['HTTP_ACCEPT_LANGUAGE']
               )
    switch($locale) {
        case 'en-us':
        case 'en-ca':
            $decimal = '.';
            $thousands = ',';
            break;
        case 'fr':
        case 'ca':
        case 'de':
        case 'en-gb':
            $decimal = ',';
            $thousands = ' ';
            break;
        case 'es':
        case 'es-mx':
        default:
            $decimal = ',';
            $thousands = ' ';
    }
    return $number_format($number,$decimals,$decimal,$thousands);
}

Обратите внимание, что я не знаю (и не исследовал) ожидаемые форматы указанных выше локалей.

Ry Biesemeyer 13.01.2009 02:28

мы используем $ decimal = '.' и $ousand = ',' здесь в 'sunny' blighty (en-gb) :)

Christian 29.09.2014 23:38

Если вы развертываете локализованный веб-сайт, вам нужно убедиться, что вы используете setlocale (). Чтобы избавиться от вышеприведенного сообщения yaauie, я бы добавил что-то вроде следующего фрагмента кода в ваш код инициализации:

$locale = ( isset($_COOKIE['locale']) ) ? 
            $_COOKIE['locale'] : 
            $_SERVER['HTTP_ACCEPT_LANGUAGE'];
setlocale(LC_ALL, $locale);

Затем мы модифицируем приведенную выше функцию number_format_locale(), чтобы она выглядела так:

function number_format_locale($number,$decimals=2) {
    $locale = localeconv();
    return number_format($number,$decimals,
               $locale['decimal_point'],
               $locale['thousands_sep']);
 }

Конечно, это в идеальном мире, в зависимости от платформы, на которой вы выполняете развертывание, и от того, какую версию файлов локали вы установили, вам, возможно, придется закодировать некоторые нарушения. Но установка локали поможет с деньгами, числами и датами.

Гений. Сработало для меня как шарм.

Rémi Breton 23.10.2013 21:50

Помните, что setlocale () не является потокобезопасным. Это означает, что если вы используете PHP на сервере, который использует потоки вместо процессов (или планируете когда-нибудь), не используйте setlocale () для изменения локали. См. Новый ответ, в котором предлагается NumberFormatter, который сейчас является предпочтительным способом сделать это.

orrd 11.06.2015 08:52

Когда есть "thousands_sep" => b" " (например, локаль sk_SK), это не работает. В блейде {{ number_format_locale(2500) }} ничего не показывает.

Jakub Adamec 10.08.2020 16:37

В своем проекте я использую Zend Framework. В данном случае я использую такую ​​штуку:

$locale = new Zend_Locale('fr_FR');
$number = Zend_Locale_Format::toNumber(2.5, array('locale' => $locale));

// will return 2,5
print $number;

Может быть, попробовать подход, независимый от установки глобальной локали для всех скриптов?

Получить локаль пользователя:

$locale = ( isset($_COOKIE['locale']) ) ? 
            $_COOKIE['locale'] : 
            $_SERVER['HTTP_ACCEPT_LANGUAGE'];

Отформатируйте номер:

Рекомендую использовать PHP NumberFormatter. Это подход ООП, который использует Библиотека ICU.

$formatStyle=NumberFormatter::DECIMAL;
$formatter= new NumberFormatter($locale, $formatStyle);
echo $formatter->format(3253454);//proper output depending on locale

Здесь вы можете использовать множество различных форматов стилей, например: DECIMAL, CURRENCY или PERCENT. Узнать больше здесь.

Это лучший способ форматирования чисел, потому что он зависит от глобального Репозиторий данных Unicode Common Locale.

Между тем PHP предлагает класс NumberFormatter, который идеально подходит для этой цели:

http://php.net/manual/de/class.numberformatter.php

Другие вопросы по теме