我有一个人们将输入美元价值的表格。
可能的输入:
$ 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;
答案 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)
答案 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”之类的字符串以及其他此类非金钱字符串。这提出了一个问题,“你需要处理格式错误的字符串吗?”