问题描述
我有一个类别为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
,最大的错误是price
与varchar(100)
一样-它是string
,可以百万种方式显示,但无法重新计算。没有任何借口。它应该是integer
或decimal
,并且任何减法都应使用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);