PHP setlocale()在Windows 10机器上不能正常工作


PHP setlocale() not working correctly on Windows 10 machine

我想在美元中显示一个货币金额,我正在寻找一个函数,并在PHP手册中找到了这样的功能-在这里输入链接描述。拉斐尔·m·萨尔维奥尼提交的。事实证明,它不适用于一些较旧的操作系统,因此应该使用setlocale()函数来防止错误。所以我有下面的代码:

setlocale(LC_MONETARY, 'en_US.UTF-8'); 

它在Windows 8.1上工作得很好,但现在我正在使用Windows 10,似乎这现在不起作用。我尝试了下面的代码,看看setlocale函数将返回什么:

<?php
 setlocale(LC_ALL,"US");
 $locale_info = localeconv();
 print_r($locale_info);
?>

我得到的是:

Array ([decimal_point] =>。[thousands_sep] => [int_curr_symbol] => [currency_symbol] => [mon_decimal_point] => [mon_thousands_sep] => [positive_sign] => [negative_sign] => [int_frac_digits] => 127 [p_cs_precedes] => 127 [n_sep_by_space] => 127 [p_sign_posn] => 127 [n_sign_posn] => 127 [grouping] => Array () [mon_grouping] => Array ())

当我在w3schools.com中运行相同的代码时,数据似乎非常不同:

Array ([decimal_point] =>。[thousands_sep] =>, [int_curr_symbol] => USD [currency_symbol] => $ [mon_decimal_point] =>。[mon_thousands_sep] =>, [positive_sign] => [negative_sign] => - [int_frac_digits] => 2 [frac_digits] => 2 [p_cs_precedes] => 1 [p_sep_by_space] => 0 [p_sign_posn] => 3 [n_sign_posn] => 0 [grouping] => Array ([0] => 3)

我已经手动设置了US的值:

$locale = array(
    'decimal_point'        => '.',
    'thousands_sep'        => ',',
    'int_curr_symbol'    => 'USD',
    'currency_symbol'    => '$',
    'mon_decimal_point'    => '.',
    'mon_thousands_sep'    => ',',
    'positive_sign'        => '',
    'negative_sign'     => '-',
    'int_frac_digits'    => 2,
    'frac_digits'        => 2,
    'p_cs_precedes'        => 1,
    'p_sep_by_space'    => 0,
    'p_sign_posn'        => 3,
    'n_sign_posn'        => 0,
    'grouping'            => array(),
    'mon_grouping'        => array(0 => 3, 1 => 3)
);

现在看来这是有效的,但是只要我需要美元,这个解决方案就会有效。

你知道为什么setlocale()函数在Windows 10中工作方式不一样,但在Windows 8.1中工作正常吗?我一直在使用相同的PHP版本两次

你的代码段给我的结果与你在Windows 10上得到的结果完全相同,我刚刚在CentOS (Linux)上测试了它。用var_dump检查setlocale的返回值告诉我它返回FALSE,根据PHP文档,它的意思是:

如果区域设置功能,

返回FALSE未在您的平台上实现,则指定的区域设置没有存在或类别名称无效。

所以这导致我做以下改变,它给出了正确的结果,你之后:

setlocale(LC_ALL, 'en_US');