3

我想将字符串转换为浮点数,但我遇到了一些问题。这是我的代码

    $dataValue = $item[$data];
    $dataValue = trim($dataValue);
    var_dump($dataValue);echo "<br>";
    $dataValue = str_replace(',', '.', $dataValue);
    var_dump($dataValue);echo "<br>";
    var_dump(floatval($dataValue));echo "<br>";
    var_dump(floatval('4.02'));echo "<br>";

和结果

string(7) "4,02"
string(7) "4.02"
float(4)
float(4.02)

我不明白第三个结果,为什么我有 4 而不是 4.02 ?

谢谢

编辑:

我的新代码:

$dataValue = $item[$data];

        echo mb_detect_encoding($dataValue) . "<br>";

        $dataValue = iconv('ASCII', 'UTF-8//TRANSLIT', $dataValue);
        $dataValue = trim($dataValue);
        $dataValue = str_replace(',', '.', $dataValue);

        echo mb_detect_encoding($dataValue) . "<br>";

        var_dump($dataValue);echo"<br >";
        $dataValue = mb_convert_encoding($dataValue, "UTF-8");
        var_dump($dataValue);echo"<br >";
        $dataValue = str_replace(',', '.', $dataValue);
        $dataValue = floatval($dataValue);
        var_dump($dataValue);echo"<br >";`

结果

ASCII
ASCII
string(7) "4.02"
string(7) "4.02"
float(4)
4

5 回答 5

5

只有 4 个可见字符,但var_dump()声称有 7 个。我推测小数点前有一个不可见字符导致floatval()过早终止转换。您可以通过查看$dataValue.

编辑:

您的字符串似乎是用 UTF-16LE 编码的。在处理之前使用 mb 或 iconv 将其转换为 ASCII/UTF-8。

于 2013-01-16T18:30:59.367 回答
0

测试了这个:

$dataValue = "4,02";
$dataValue = trim($dataValue);
var_dump($dataValue);echo "<br>";
$dataValue = str_replace(',', '.', $dataValue);
var_dump($dataValue);echo "<br>";
var_dump(floatval($dataValue));echo "<br>";
var_dump(floatval('4.02'));echo "<br>";

输出:

string(4) "4,02"
string(4) "4.02"
float(4.02)
float(4.02) 

您确定发布的代码会产生所描述的问题吗?

编辑

尝试添加这个:

$dataValue = preg_replace("/[^0-9\,]/", '', $dataValue);
于 2013-01-16T18:25:05.330 回答
0

使用 number_format(float_number, decimal_places):

var_dump(number_format(floatval($dataValue) ,2));
于 2013-01-16T18:26:12.550 回答
0

我相信不同之处在于 $dataValue 在第三个输出中是双引号字符串,而在第四个示例中使用单引号字符串。在 PHP 中,在处理如何将它们视为文字时,它们的工作方式不同。

于 2013-01-16T18:26:14.183 回答
0

我将假设它与 PHP 的浮点实现中的准确性问题有关。

看看这个:维基百科:浮点精度问题

于 2013-01-16T18:26:35.270 回答