我想以美元显示金额,我正在寻找一个功能,并在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版本。
答案 0 :(得分:0)
您的代码片段给出的结果与您在Windows 10上获得的结果完全相同,我只是在CentOS(Linux)上测试过。使用var_dump检查setlocale的返回值告诉我它返回FALSE,并且根据PHP文档它意味着:
如果是语言环境功能,则返回FALSE 未在您的平台上实现,指定的区域设置不会 存在或类别名称无效。
因此,这导致我做出以下更改,这会给出正确的结果:
setlocale(LC_ALL, 'en_US');