PHP的floatval不能识别语言环境

时间:2011-09-04 23:49:14

标签: php

我发现PHP的字符串到浮点转换不能识别语言环境。如果我将setlocale()设置为小数点为逗号的语言环境,则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
?>

我得到的输出如下:

decimal_point is `,'
float to string: 3,14
string to float: 3

这适用于Windows上的PHP 5.3.6。这是预期的行为吗? Unix上的PHP会给出相同的结果吗?

1 个答案:

答案 0 :(得分:4)

The PHP Manual

中有一个区域设置感知功能
<?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);
}
?>

这比简单地用点替换逗号更安全,因为这会破坏某些语言环境的内容。