我想为我的网站访问者设置数字3253454。
如果我使用内置的number_format函数,我得到:3,253,454这对英国和美国很有用,但大多数其他国家使用3.253.454
我有很多国际访客。
有人能指点我这里的最佳做法吗?
理想情况下,我希望获取浏览器的区域设置并相应地格式化数字。这在PHP中甚至可能吗?
答案 0 :(得分:18)
如果您要部署本地化网站,则需要确保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']);
}
当然,这是一个理想的世界,取决于您部署到的平台,以及您安装的语言环境文件的版本,您可能需要编写一些违规行为的代码。但设置区域设置将有助于金钱,数字和日期。
答案 1 :(得分:9)
也许尝试独立于为所有脚本设置全局语言环境?
获取用户的区域设置:
$locale = ( isset($_COOKIE['locale']) ) ?
$_COOKIE['locale'] :
$_SERVER['HTTP_ACCEPT_LANGUAGE'];
格式化数字:
我建议使用PHP NumberFormatter。它是一种使用ICU library的OOP方法。
$formatStyle=NumberFormatter::DECIMAL;
$formatter= new NumberFormatter($locale, $formatStyle);
echo $formatter->format(3253454);//proper output depending on locale
您可以在那里使用许多不同的样式格式,例如:DECIMAL,CURRENCY或PERCENT。阅读更多here。
这是数字格式化的最佳方式,因为它取决于全局Unicode Common Locale Data Repository。
答案 2 :(得分:6)
string number_format (float $number, int $decimals, string $dec_point, string $thousands_sep)
另一个有用的链接可能来自Zend Framework Zend_Locale - 它可以检测用户的语言并帮助进行数字/货币格式化
答案 3 :(得分:3)
来自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;
}
}
?>
这似乎正是您正在寻找的。 :)
答案 4 :(得分:2)
PHP同时提供了一个NumberFormatter类,它非常适用于此目的:
答案 5 :(得分:0)
在我的项目中,我使用Zend Framework。在这种情况下,我使用这样的东西:
$locale = new Zend_Locale('fr_FR');
$number = Zend_Locale_Format::toNumber(2.5, array('locale' => $locale));
// will return 2,5
print $number;
答案 6 :(得分:-1)
您可以使用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);
}