区域设置小数点和类型转换的奇怪行为

时间:2012-01-18 09:55:56

标签: php

区域设置设置为setlocale(LC_ALL, 'ru_RU.UTF-8') 在俄罗斯,小数点为,

我正在输入字符串(例如,11,25)。 当我将它转换为加倍$double = (double)$double;时,我正在失去精确度。

setlocale(LC_ALL, 'ru_RU.UTF-8');

$input = '11,25';
var_dump((double)$input); //11

$linfo = localeconv();
$input = '11'.$linfo['decimal_point'].'25';
var_dump((double)$input); //11

$input = '11.25';
var_dump((double)$input); //11,25

所以,因为我只能看到区域设置效果。 这是否意味着我应该在运行十进制值之前始终str_replace(array(',','.'), '.', $input)

2 个答案:

答案 0 :(得分:2)

我相信setlocale失败了。尝试用

替换setlocale(LC_ALL, 'ru_RU.UTF-8');
if (false !== setlocale(LC_ALL, 'en_GB')) {
    echo "Locale set";
}
else{
    echo "Locale set failed";
}

您发布的代码为我提供了Locale set failed(win7x86,PHP 5.2.12,系统区域设置为en_US)。

<强>已更新

On Win it setlocale(LC_ALL, 'Russian_Russia.1251')但转换结果与您描述的一样。

答案可以在Using setlocale() doesn't affect PHPs number conversions中找到。简而言之,类型转换不受区域设置的影响(请参阅PHP manual)您必须首先用点替换基于区域设置的小数分隔符。我想

str_replace($linfo['decimal_point'], '.', $input)

会更合适,更灵活,更健壮(虽然我不知道使用除逗号和点之外的小数分隔符的文化:))。

答案 1 :(得分:-2)

在PHP小数点是.。它不依赖于语言环境。