我发现 PHP 的字符串到浮点转换不支持区域设置。如果我将 locale() 设置为小数点为逗号的区域设置,则 floatval 无法解析“3,14”。我发现这令人惊讶,尤其是因为相反的转换(浮点到字符串)是区域设置感知并输出逗号。
<?php
setlocale(LC_ALL, "Norwegian", "no");
$localeconv = localeconv();
echo "decimal_point is `" . $localeconv['decimal_point'] . "'<br/>";
print "float to string: " . 3.14 . "<br/>"; // <-- Outputs "3,14" CORRECT
print "string to float: " . floatval("3,14"); // <-- Outputs "3" INCORRECT
?>
Run Code Online (Sandbox Code Playgroud)
我得到的输出如下:
decimal_point is `,'
float to string: 3,14
string to float: 3
Run Code Online (Sandbox Code Playgroud)
这是 Windows 上的 PHP 5.3.6。这是预期的行为吗?Unix 上的 PHP 会给出相同的结果吗?
PHP 手册中有一个区域设置感知函数
<?php
function ParseFloat($floatString){
$LocaleInfo = localeconv();
$floatString = str_replace($LocaleInfo["mon_thousands_sep"] , "", $floatString);
$floatString = str_replace($LocaleInfo["mon_decimal_point"] , ".", $floatString);
return floatval($floatString);
}
?>
Run Code Online (Sandbox Code Playgroud)
这比简单地用点替换逗号更安全,因为这会破坏某些语言环境。