Php 如何减去两个数字字符串

Php 如何减去两个数字字符串,php,Php,我有两个数字类型的字符串,但结果是错误的 $totalamount='41,305.33'; $normalamount='999.72'; echo $total=$totalamount-$normalamount; 是否有其他方法来执行此操作或处理我自己的代码。错误的原因是字符串上有逗号 $totalamount = floatval(str_replace(',', '','41,305.33')); $normalamount = floatval(str_replace(',',

我有两个数字类型的字符串,但结果是错误的

$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;

顺便说一句,-别名

这里是
数字格式()的反向函数

解决方案:

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
输出:

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

由于“,”字符,您得到了一个错误的值,只需删除它们

$totalamount='41,305.33';
$normalamount='999.72';
echo (double)str_replace(',','',$totalamount)-
     (double)str_replace(',','',$normalamount);
您可以使用
floatval()
来实现所需的功能,但需要从字符串中删除“,”

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

// Writes: 40305.61

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

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

您可以使用



您可能希望丢失
echo
$total=
(取决于您是要输出差值还是只计算差值)。两者都应该起作用,因为赋值是一个表达式(其计算结果基本上是赋值),但在一个语句中同时进行这两项操作有点令人毛骨悚然。如果您只需删除逗号,它就会像上面预期的那样起作用。请看我的答案。注意,强制转换为一个数字并不是绝对必要的——PHP将作为数学的一部分为您完成这项工作。只有当你试图减去物体或其他东西时,这才重要,而且在这一点上,你的数学无论如何都会变得很糟糕。@cHao我同意你的看法。我只是想说明强制转换是如何工作的:)也许是为了将来的参考。这里不需要调用
floatval
。@Ultimater如果你有一个数值变量,最好保持数字格式。否则,PHP将需要在每个操作中将其强制转换为一个数字。是的,“没有必要”,但这是一个很好的实践。@jackflash:如果你大量重用这些值,这是一个很好的实践。如果您只使用过一次,那就是noise.PHP已经有了这个功能。没有必要定义这么复杂的函数来处理这么简单的操作。@Ultimater如果从数据库或用户检索到
$totalamount
,该怎么办?它不像“删除逗号,PHP将处理它”那么简单。是的,它是:
$totalamount=str_replace(',','',$totalamount)
$normalamount=str_replace(“,”,“,”$normalamount)
@Ultimater想象一下,
$totalamount
已根据给定的区域设置使用
number\u format()
格式化。如果千位分隔符不是
,则这将不起作用。另外,最好将数值变量保持为数字类型,这样PHP就不必在以后的每个操作中强制转换它。这是非常冗余的<代码>str_replace(',','','41305.33')-'999.72'
就可以了。没有必要浮动两次。谢谢你的反馈。@BenM没有必要手动施放,但事实上这是一个非常好的实践,所以你的代码以前更好。@jackflash:他用
(float)
floatval()
施放了两次。这绝对正确,这是解释为什么会发生这种情况的唯一答案。为什么是反对票+我想猜这是被否决的,因为“我有这个数据,它给我带来了问题…”的正确答案不是“使用不同的数据”。如果没有解释,这实际上是一个没有答案的问题。数据可能来自数据库或其他东西。(我的意思是,当
41305.33
更好的时候,谁真的用真实的代码输入了
'41305.33'
,这显然是一个最小的例子。)如果用一些代码将“无效”数据转换成有效的数据(就像
str\u replace
示例那样),答案会好得多。这些数值变量仍然是格式化字符串,所以下次要使用它们进行操作时,必须再次转换它们。此外,如果这些变量是根据给定的区域设置格式化的,小数点可能会不同。如果您不打算将转换存储在变量中,则手动转换为
double
没有意义。