PHP setlocale存在,但错误


PHP setlocale exist but is Wrong

我正在尝试在应用程序中设置pt_BR区域设置。

但是,由于某种原因,我的数字格式配置仍然是错误的格式。

我试图通过多种方式设置正确的区域设置:

setlocale(LC_ALL, 'pt_BR');
setlocale(LC_ALL, 'pt_BR.utf-8', 'pt_BR', 'portuguese', 'pt-br');
setlocale(LC_ALL, 'pt_BR.utf-8');
setlocale(LC_ALL, 'portuguese');

但是,对于所有这些,我都有一个带点的小数点。在葡萄牙语中,正确的值是逗号。结果都一样:

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

这种情况发生在我的本地环境和我测试过的其他一些Windows计算机中。但在其他一些Windows中,它是有效的。所有运行Windows 7的计算机。我还在UNIX环境中进行了测试,并且运行良好。此问题仅适用于某些Windows安装。

区域设置存在,但由于某些原因出现错误。

有人想帮我吗?我想知道为什么会发生这种事。

感谢

Windows和unix使用不同的区域设置代码。此外,某些区域设置可能未安装在系统上。这使得setlocale功能不容易移植。

setlocale手册警告可能的失败原因:

返回新的当前区域设置,如果区域设置功能为FALSE没有在您的平台上实现,指定的区域设置没有存在或类别名称无效。

您应该检查返回值,并尝试一种变通方法,以防区域设置不可用。

更新

关于您的问题,当setlocale调用成功但对区域设置没有影响时,我发现此错误报告的状态为won't-fix。在bug注释中,函数通常被描述为不可预测的。失败的一个可能原因是它不是线程安全的。还有另一个类似的错误报告标记为重复。有趣的是,两位记者都将Windows 7列为他们的平台。