我该如何使用setlocale?设置LC_NUMERIC有时只能工作

Pug*_* Se 1 php locale

我的测试脚本从设置一些LC_values开始

setlocale(LC_ALL, "sv_SE.utf8");
setlocale(LC_CTYPE, "sv_SE.utf8");
setlocale(LC_NUMERIC, "en_US.utf8");
Run Code Online (Sandbox Code Playgroud)

然后我有一个延迟的循环存储3/2的结果:

$list = array();
$number = 3/2;

foreach(range(1, 1000) as $i)
{
    $key = (string) $number;

    if(!isset($list[$key]))
    {
        $list[$key] = 0;
    }

    $list[$key]++;

    usleep(100 * 1000);
}
Run Code Online (Sandbox Code Playgroud)

结果是:

Array
(
   [1.5] => 997
   [1,5] => 3
) 
Run Code Online (Sandbox Code Playgroud)

为什么0.3%使用","而不是"."?

为什么LC_NUMERIC不能保持我设定的值?

我该如何防止这种情况发生?

也试过strftime("%A"),瑞典只有6.6%

上面的测试是用apache-2.2.22和php-5.5.2完成的.

如果我从bash/cli运行测试,我得到1000"1.5"和1000"torsdag"的预期结果

小智 6

像以前一样设置你的语言环境,但重置小数分隔符可能有这种情况,你可能需要设置语言环境(即使我不知道什么时候这应该是必须的).如果是这样,您可以在设置已设置的语言环境后重置小数点分隔符:

<?php
setlocale(LC_ALL, "de_DE");
setlocale(LC_NUMERIC, 'C');
?>
Run Code Online (Sandbox Code Playgroud)

这个重置为'C'语言环境的数值告诉操作系统和PHP,必须使用C/C++类型的小数分隔符,定义为'.' 用于编程语言.现在,如果您正在使用普通的PHP date()函数,那么您将获得基于区域设置的月份名称,但是您也可以获得正确的计算和转换数值(但是您将丢失已知的十进制sep char语言环境).