2012-10-19 66 views
2

我有两个数字类型的字符串,但结果出错了。如何减去两个数字串

$totalamount='41,305.33'; 
$normalamount='999.72'; 
echo $total=$totalamount-$normalamount; 

是否有任何其他方式来做到这一点或问题与我自己的代码。

+0

您可能要失去'echo'或'$总='(取决于您是否要输出的差或只是计算它)。由于赋值是一个表达式(基本上赋值给赋值),所以两个都应该工作,但是在一个语句中执行这两个操作都有点令人毛骨悚然。 – cHao

+1

如果您只是删除逗号,它将按预期工作。看到我的答案。 – Ultimater

回答

2

错误的原因是该字符串上有逗号。

$totalamount = floatval(str_replace(',', '','41,305.33')); 
$normalamount = floatval(str_replace(',', '','999.72')); 
echo $total = $totalamount-$normalamount; 

顺便说一句,doubleval() - 的floatval()

+0

请注意,铸造到一个数字并不是绝对必要的 - PHP会为你做这个数学的一部分。只有当你试图减去物体或某物时才重要,并且在那个时候你的数学将会变得棘手。 – cHao

+0

@cHao我同意你的意见。我只是试图展示如何铸造也可以工作:)也许供将来参考。 –

+0

这里没有必要调用'floatval'。 – Ultimater

2

别名这里是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 
+0

PHP已经有这个功能http://de3.php.net/manual/en/class.numberformatter.php – MarcDefiant

+2

@Mogria是的,在5.3之后。 – Carlos

+1

没有必要定义这样一个复杂的函数来处理这样一个简单的操作。 – Ultimater

2

您因 '' 性格得到了错误的值,简单地删除它们......

$totalamount='41,305.33'; 
$normalamount='999.72'; 
echo (double)str_replace(',','',$totalamount)- 
    (double)str_replace(',','',$normalamount); 
+0

在我看来是最好的答案。 – Ultimater

+0

不在我的。这些数字变量仍然是格式化的字符串,所以下一次你想用它们操作时,你必须再次转换它们。此外,在这些变量按照给定区域格式化的情况下,小数点可能不同。 – Carlos

+1

如果你不打算将变换存储在一个变量中,那么手动投射为“double”缺乏意义。 – Carlos

1

您可以使用floatval()实现你在找什么,但你需要从字符串中删除“”:

$totalamount = str_replace(',' , '', '41,305.33'); 
$normalamount = '999.72'; 
echo $totalamount - $normalamount; 

// Writes: 40305.61 
+1

非常多余。 'str_replace(',','','41,305.33') - '999.72''就可以做到。 –

+1

没有必要浮动两次。 – Ultimater

+0

感谢您的反馈。 – BenM

-1

只需删除逗号,它按预期工作。 没有必要手动将字符串转换为数字,因为减号操作符会为我们执行此操作。

<?php 
$totalamount='41305.33'; 
$normalamount='999.72'; 
echo $total=$totalamount-$normalamount; 

原因'41,305.33'-'999.72'结果-958.72是因为PHP,只要它看到一个逗号,认为有一个无效的数字,修剪掉剩余的字符。因此,你留下了'41'-'999.72'这确实是-958.72

+1

这是绝对正确的,这是解释为什么会发生这种情况的唯一答案。为什么downvotes?! +1来计数行为。 –

+0

@Alix:我想猜测它被低估了,因为“我有这个数据给我的问题......”的正确答案不是“使用不同的数据”。如果不是为了解释,这实际上是一个无法回答的问题。数据可能来自数据库或其他东西。 (我的意思是,在41305.33更好的情况下,谁真的用真实代码输入'41,305.33'?这显然是一个很小的例子。)用一些代码将答案转换为“invalid “数据转化为有用的东西(就像'str_replace'的例子那样)。 – cHao

-1

则可以将格式化的数字转换为数字PHP懂得使用NumberFormatter

$fmt = numfmt_create('de_DE', NumberFormatter::DECIMAL); 
echo $total = $fmt->parse('41,305.33') - $fmt->parse('999.72');