我在windows vista
上运行PHP
。所以,我试图了解区域设置函数是如何工作的。我从
setlocale(LC_ALL, $locale)
和localeconv()
起初它使用 CLDR 语言环境 ID(我认为..,刚开始学习 PHP 语言环境),如"en_US"、"en_UK"等,结果如 PHP 文档示例中所示。但是现在setlocale()
和localeconv()
仅适用于$locale
值,例如"English_United Kingdom.1252"
和"English_United States.1252"
,我认为这些值是基于Windows的区域设置ID。
所以当我这样做时:
var_dump(setlocale(LC_ALL, "en_US"));
var_dump(localeconv());
我得到这些结果:
boolean false
array (size=18)
'decimal_point' => string '.' (length=1)
'thousands_sep' => string '' (length=0)
'int_curr_symbol' => string '' (length=0)
'currency_symbol' => string '' (length=0)
'mon_decimal_point' => string '' (length=0)
'mon_thousands_sep' => string '' (length=0)
'positive_sign' => string '' (length=0)
'negative_sign' => string '' (length=0)
'int_frac_digits' => int 127
'frac_digits' => int 127
'p_cs_precedes' => int 127
'p_sep_by_space' => int 127
'n_cs_precedes' => int 127
'n_sep_by_space' => int 127
'p_sign_posn' => int 127
'n_sign_posn' => int 127
'grouping' =>
array (size=0)
empty
'mon_grouping' =>
array (size=0)
empty
如何使脚本响应 CLDR 语言环境 ID?
setlocale() 在你的情况下返回 false。手动:
返回新的当前区域设置,如果区域设置功能返回 FALSE,则返回 FALSE。 未在您的平台上实施
尝试使用以下之一:"美国"、"美国"或"我们"
http://msdn.microsoft.com/en-us/library/cdax410z%28v=vs.90%29.aspx
setlocale
、localeconv
和相关函数不适用于 Unicode CLDR 语言环境标识符或数据。相反,它们因操作系统而异,在 *nix 系统上具有 POSIX 区域设置标识符和数据,在 Windows 上具有Microsoft区域设置字符串和数据。
# works only on Linux after running `locale-gen de_DE.UTF-8`
# but Windows requires an entirely different locale identifier
setlocale(LC_ALL, 'de_DE.UTF-8');
$locale = localeconv();
echo number_format(
1234.5,
1, # fraction digits
$locale['decimal_point'],
$locale['thousands_sep']
); # '1.234,5'
如果您实际上希望使用 Unicode CLDR 区域设置标识符和数据来实现统一的体验,而不管您的操作系统如何,请改用国际扩展。它与 PHP 5.3 一起提供,并且是 ICU(Unicode 国际组件)库的包装器,该库提供标准化的 CLDR 语言环境数据。
$fmt = new NumberFormatter('de-DE', NumberFormatter::DECIMAL); # or 'de_DE'
echo $fmt->format(1234.5); # '1.234,5'