我有两个数字类型的字符串,但结果出错了。如何减去两个数字串
$totalamount='41,305.33';
$normalamount='999.72';
echo $total=$totalamount-$normalamount;
是否有任何其他方式来做到这一点或问题与我自己的代码。
我有两个数字类型的字符串,但结果出错了。如何减去两个数字串
$totalamount='41,305.33';
$normalamount='999.72';
echo $total=$totalamount-$normalamount;
是否有任何其他方式来做到这一点或问题与我自己的代码。
错误的原因是该字符串上有逗号。
$totalamount = floatval(str_replace(',', '','41,305.33'));
$normalamount = floatval(str_replace(',', '','999.72'));
echo $total = $totalamount-$normalamount;
顺便说一句,doubleval() - 的floatval()
别名这里是number_format()
反向功能。
解决方案:
function number_unformat($number, $dec_point = '.', $thousands_sep = ',') {
return (float)str_replace(array($thousands_sep, $dec_point),
array('', '.'),
$number);
}
$totalamount = number_unformat('41,305.33');
$normalamount = number_unformat('999.72');
$total = $totalamount - $normalamount;
echo $total;
输出:
40305.61
PHP已经有这个功能http://de3.php.net/manual/en/class.numberformatter.php – MarcDefiant
@Mogria是的,在5.3之后。 – Carlos
没有必要定义这样一个复杂的函数来处理这样一个简单的操作。 – Ultimater
您因 '' 性格得到了错误的值,简单地删除它们......
$totalamount='41,305.33';
$normalamount='999.72';
echo (double)str_replace(',','',$totalamount)-
(double)str_replace(',','',$normalamount);
只需删除逗号,它按预期工作。 没有必要手动将字符串转换为数字,因为减号操作符会为我们执行此操作。
<?php
$totalamount='41305.33';
$normalamount='999.72';
echo $total=$totalamount-$normalamount;
原因'41,305.33'-'999.72'
结果-958.72
是因为PHP,只要它看到一个逗号,认为有一个无效的数字,修剪掉剩余的字符。因此,你留下了'41'-'999.72'
这确实是-958.72
。
这是绝对正确的,这是解释为什么会发生这种情况的唯一答案。为什么downvotes?! +1来计数行为。 –
@Alix:我想猜测它被低估了,因为“我有这个数据给我的问题......”的正确答案不是“使用不同的数据”。如果不是为了解释,这实际上是一个无法回答的问题。数据可能来自数据库或其他东西。 (我的意思是,在41305.33更好的情况下,谁真的用真实代码输入'41,305.33'?这显然是一个很小的例子。)用一些代码将答案转换为“invalid “数据转化为有用的东西(就像'str_replace'的例子那样)。 – cHao
则可以将格式化的数字转换为数字PHP懂得使用NumberFormatter
$fmt = numfmt_create('de_DE', NumberFormatter::DECIMAL);
echo $total = $fmt->parse('41,305.33') - $fmt->parse('999.72');
您可能要失去'echo'或'$总='(取决于您是否要输出的差或只是计算它)。由于赋值是一个表达式(基本上赋值给赋值),所以两个都应该工作,但是在一个语句中执行这两个操作都有点令人毛骨悚然。 – cHao
如果您只是删除逗号,它将按预期工作。看到我的答案。 – Ultimater