PHP setlocale()在Windows 10计算机

时间:2015-09-01 19:38:59

标签: php

我想以美元显示金额,我正在寻找一个功能,并在PHP手册中找到了 - enter link description here。由Rafael M. Salvioni提出的那个人。事实证明,它不适用于某些较旧的操作系统,因此应使用setlocale()函数以防止出错。所以我有以下代码:

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

它在Windows 8.1上工作正常,但现在我正在使用Windows 10,而现在看来这不起作用。我已经尝试了以下代码来查看setlocale functin将返回的内容:

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

这就是我得到的:

  

数组([decimal_point] =&gt;。[thousands_sep] =&gt; [int_curr_symbol] =&gt; [currency_symbol] =&gt; [mon_decimal_point] =&gt; [mon_thousands_sep] =&gt; [positive_sign] =&gt; [negative_sign ] =&gt; [int_frac_digits] =&gt; 127 [frac_digits] =&gt; 127 [p_cs_precedes] =&gt; 127 [p_sep_by_space] =&gt; 127 [n_cs_precedes] =&gt; 127 [n_sep_by_space] =&gt; 127 [p_sign_posn] = &gt; 127 [n_sign_posn] =&gt; 127 [分组] =&gt;数组()[mon_grouping] =&gt;数组())

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

  

数组([decimal_point] =&gt;。[thousands_sep] =&gt;,[int_curr_symbol] =&gt; USD [currency_symbol] =&gt; $ [mon_decimal_point] =&gt;。[mon_thousands_sep] =&gt;,[positive_sign] =&gt; [negative_sign] =&gt; - [int_frac_digits] =&gt; 2 [frac_digits] =&gt; 2 [p_cs_precedes] =&gt; 1 [p_sep_by_space] =&gt; 0 [n_cs_precedes] =&gt; 1 [n_sep_by_space] =&gt; ; 0 [p_sign_posn] =&gt; 3 [n_sign_posn] =&gt; 0 [分组] =&gt;数组([0] =&gt; 3)[mon_grouping] =&gt;数组([0] =&gt; 3))< / p>

所以我手动设置了美国所需的值:

$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版本。

1 个答案:

答案 0 :(得分:0)

您的代码片段给出的结果与您在Windows 10上获得的结果完全相同,我只是在CentOS(Linux)上测试过。使用var_dump检查setlocale的返回值告诉我它返回FALSE,并且根据PHP文档它意味着:

  

如果是语言环境功能,则返回FALSE   未在您的平台上实现,指定的区域设置不会   存在或类别名称无效。

因此,这导致我做出以下更改,这会给出正确的结果:

setlocale(LC_ALL, 'en_US');