PHP: языковой формат - PullRequest
19 голосов
/ 13 января 2009

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

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

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

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

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

Ответы [ 7 ]

18 голосов
/ 13 января 2009

Если вы развертываете локализованный веб-сайт, вам нужно убедиться, что вы 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']);
 }

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

9 голосов
/ 28 февраля 2015

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

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

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

Форматировать число:

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

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

Вы можете использовать там много разных форматов стилей, например: DECIMAL, CURRENCY или PERCENT. Подробнее здесь .

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

6 голосов
/ 13 января 2009
string number_format (float $number, int $decimals, string $dec_point, string $thousands_sep)

см. php доку для числового формата

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

3 голосов
/ 13 января 2009

С 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;
        }
    }

?>

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

2 голосов
/ 17 марта 2017

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

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

0 голосов
/ 15 марта 2012

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

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

// will return 2,5
print $number;
0 голосов
/ 13 января 2009

Вы можете использовать переменную сервера 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...