区域设置设置为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)
?
答案 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小数点是.
。它不依赖于语言环境。