2012-01-18 77 views
0

区域设置设置为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

我认为setlocale已经失败。试着用

if (false !== setlocale(LC_ALL, 'en_GB')) { 
    echo "Locale set"; 
} 
else{ 
    echo "Locale set failed"; 
} 

你已经发布的代码替换setlocale(LC_ALL, 'ru_RU.UTF-8');给我Locale set failed(win7x86,PHP 5.2.12,系统语言环境是en_US)。

修订

赢球是setlocale(LC_ALL, 'Russian_Russia.1251'),但转换的结果是,就像你描述。

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

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

会更合适,灵活和强大的(虽然我不知道,使用比逗号和点:)其他小数点分隔符的文化)。

-2

在PHP中,小数点是.。这不取决于语言环境。