PHP将带空格的字符串数字转换为Float

问题描述

我有一个类别为varchar(100)的班级。它以1 000.00的形式存储在数据库中(不要问我为什么,不是我的主意),我必须检索它并除以其他价格,该价格也可以从数据库中检索出来。

数据库中的数字看起来像:1 000 000.00-数千个部分之间用空格分隔(一百万个看起来像-> $a = "3 999.99"; $b = "1 500.11"; $aa = floatval(str_replace(' ','',$a)); $bb = floatval(str_replace(' ',$b)); $c = $aa - $bb; echo $aa . ' - ' . $bb . ' = ' . $c; )。

我在带有在线解释程序的网站:w3resource.com/PHP上尝试过。

要做的是...

3999.99 - 1500.11 = 2499.88

显示正确的输出

$a = "3 999.99"; $b = "1 500.11"; $aa = floatval(str_replace(' ',$b)); $c = $aa - $bb; echo $aa . ' - ' . $bb . ' = ' . $c;

但是当我在项目中执行此操作时,就像:

3999.99 - 1500.11 = 2.00
3 - 1

在我的项目中,价格被截断-空格被截断并且仅对前几位执行计算之后的所有内容,在我的情况下为:{{1}}

有人可以告诉我在哪里寻找错误吗?

解决方法

很可能您有一个不可见的字符作为千位分隔符。清理输入字符串时,过滤除数字和.以外的所有字符更为安全。这可以通过preg_replace函数来实现。

您的脚本可以修改为如下形式:

$a = "3 999.99";
$b = "1 500.11";

$aa = floatval(preg_replace('/[^0-9.]/','',$a));
$bb = floatval(preg_replace('/[^0-9.]/',$b));

$c = $aa - $bb;
echo $aa . ' - ' . $bb . ' = ' . $c;

此外,特别是在处理钱时使用浮点数有点危险且不精确。请查看该存储库,该存储库对解决此问题有很大帮助:https://github.com/moneyphp/money

,

最大的错误是pricevarchar(100)一样-它是string,可以百万种方式显示,但无法重新计算。没有任何借口。它应该是integerdecimal,并且任何减法都应使用SQL进行。

第二个错误是当您使用float作为price的值时。将PHP float留给天体物理学家,使用int

$a = "3 999.99";
$b = "1 500.11";

$a1 = (int) preg_replace('/[^0-9]/',$a);
$b1 = (int) preg_replace('/[^0-9]/',$b);

var_dump($a1,$b1);                         // test
echo'<hr>';

$c1 = $a1 - $b1;

var_dump($a1,$b1,$c1);                    // test

要显示的格式:

echo substr_replace(substr_replace($c1,' ',-5,0),'.',-2,0);