如何在PHP中一起添加货币字符串(非标准化输入)?

时间:2008-09-25 16:36:05

标签: php

我有一个人们将输入美元价值的表格。

可能的输入:
$ 999,999,999.99
999,999,999.99
999999999个
99,999
$ 99,999

用户可以根据需要输入美元值。我希望将输入读作双打,以便我可以将它们合计。

我尝试将字符串强制转换为双打,但这不起作用。输出时总数等于50:

$string1 = "$50,000";
$string2 = "$50000";
$string3 = "50,000";
$total = (double)$string1 + (double)$string2 + (double)$string3;
echo $total;

7 个答案:

答案 0 :(得分:2)

正则表达式不会将您的字符串转换为数字。我建议您使用正则表达式来验证字段(确认它符合您允许的格式之一),然后只是循环遍历字符串,丢弃所有非数字和非句点字符。如果您不关心验证,则可以跳过第一步。第二步仍然会将其剥离为数字和句点。

顺便说一句,在计算货币值时,您无法安全地使用浮点数。您将失去精确度,并且很可能最终得出与输入不完全匹配的总计。

更新:您可以使用以下两个函数来验证输入并将其转换为小数点表示。

function validateCurrency($string)
{
    return preg_match('/^\$?(\d{1,3})(,\d{3})*(.\d{2})?$/', $string) ||
           preg_match('/^\$?\d+(.\d{2})?$/', $string);
}

function makeCurrency($string)
{
    $newstring = "";

    $array = str_split($string);
    foreach($array as $char)
    {
        if (($char >= '0' && $char <= '9') || $char == '.')
        {
            $newstring .= $char;
        }
    }

    return $newstring;
}

第一个函数将匹配的货币格式大宗你可以期望“$ 99”,“99,999.00”,等等。它不会匹配” .00" 或‘99’,也不会符合大多数欧洲风格的数字( 99.999,00)。在原始字符串上使用此字符串以验证它是否是有效的货币字符串。

第二个函数将删除除数字和小数点以外的所有内容。请注意,它本身仍然可以返回无效字符串(例如“”,“......”和“abc”表示为“”,“......”和“”)。一旦验证了字符串,就用它来消除无关的逗号,或者如果你想跳过验证,可以单独使用它。

答案 1 :(得分:2)

您不希望将货币值表示为浮点数!

例如,采用以下(看似直接的)代码:

$x = 1.0;
for ($ii=0; $ii < 10; $ii++) {
  $x = $x - .1;
}
var_dump($x);

您可能会认为它会产生零值,但事实并非如此。由于$x是一个浮点,它实际上最终只是一个小于零(1.38777878078E-16),这本身并不是一个大问题,但它意味着将该值与另一个值进行比较isn保证是正确的。例如,$x == 0会产生错误。

答案 2 :(得分:0)

http://p2p.wrox.com/topic.asp?TOPIC_ID=3099

一步一步地完成它

[编辑]典型......该网站现在似乎已经停止了...... :(

答案 3 :(得分:0)

不是一个班轮,但如果你删除','你可以这样做:(这是伪代码)

 m/^\$?(\d+)(?:\.(\d\d))?$/
 $value = $1 + $2/100;

允许9.99美元而不是9美元。或9.9美元,并没有抱怨错失的千位分隔符(错误或功能?)

这里存在潜在的“地方性”问题,因为你假设成千上万的用','和美分作为'。'。但在欧洲则相反(例如1.000,99)

答案 4 :(得分:0)

我建议不要使用浮点数来存储货币值。如果总和变大,您可能会出现舍入错误。 (好吧,如果它非常大。)

最好使用具有足够大范围的整数变量,并将输入存储为美分,而不是美元。

答案 5 :(得分:0)

我相信你可以用printf完成这个,这与同名的c函数类似。但它的参数可能有些深奥。你也可以使用php的number_format函数

答案 6 :(得分:0)

假设您获得真钱货币,您可以简单地删除不是数字或小数点的字符:

(pseudocode) 
newnumber = replace(oldnumber, /[^0-9.]/, //)

现在您可以使用

之类的东西进行转换
double(newnumber)

但是,这不会处理诸如“5.6.3”之类的字符串以及其他此类非金钱字符串。这提出了一个问题,“你需要处理格式错误的字符串吗?”