我想将字符串转换为float但我有一些问题。 这是我的代码
$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)
答案 0 :(得分:5)
只有4个可见字符,但var_dump()
声称有7个。我猜测在小数点之前有一个不可见的字符导致floatval()
过早终止转换。您可以通过查看$dataValue
。
修改强>
您的字符串似乎以UTF-16LE编码。在处理之前使用mb或iconv将其转换为ASCII / UTF-8。
答案 1 :(得分: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);
答案 2 :(得分:0)
使用number_format(float_number,decimal_places):
var_dump(number_format(floatval($dataValue) ,2));
答案 3 :(得分:0)
我认为不同之处在于$ dataValue在第三个输出中是双引号字符串的快速,而在第四个示例中使用单引号字符串。在PHP中,these work differently在处理它们如何被视为文字时。
答案 4 :(得分:0)
我将假设它与PHP的浮点实现中的准确性问题有关。