Я хочу отформатировать номер 3253454 для посетителей моего сайта.
Если я использую встроенную функцию number_format, я получаю: 3,253,454, что отлично подходит для Великобритании и США, однако в большинстве других стран используется 3,253,454
У меня много иностранных посетителей.
Может ли кто-нибудь дать мне указатель на лучшую практику здесь?
В идеале я хочу получить языковой стандарт браузера и соответствующим образом отформатировать номер. Возможно ли это вообще в PHP?






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);
}
мы используем $ decimal = '.' и $ousand = ',' здесь в 'sunny' blighty (en-gb) :)
Если вы развертываете локализованный веб-сайт, вам нужно убедиться, что вы используете 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']);
}
Конечно, это в идеальном мире, в зависимости от платформы, на которой вы выполняете развертывание, и от того, какую версию файлов локали вы установили, вам, возможно, придется закодировать некоторые нарушения. Но установка локали поможет с деньгами, числами и датами.
Гений. Сработало для меня как шарм.
Помните, что setlocale () не является потокобезопасным. Это означает, что если вы используете PHP на сервере, который использует потоки вместо процессов (или планируете когда-нибудь), не используйте setlocale () для изменения локали. См. Новый ответ, в котором предлагается NumberFormatter, который сейчас является предпочтительным способом сделать это.
Когда есть "thousands_sep" => b" " (например, локаль sk_SK), это не работает. В блейде {{ number_format_locale(2500) }} ничего не показывает.
В своем проекте я использую 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, который идеально подходит для этой цели:
Обратите внимание, что я не знаю (и не исследовал) ожидаемые форматы указанных выше локалей.