可能重复:
PHP: unformat money
如何摆脱不是数字或点的所有内容,使用轻型正则表达式将,
替换为.
?
示例:
$50.45 = 50.45
USD 50.45 = 50.45
50,45 = 50.45
USD$ 50.45 = 50.45
答案 0 :(得分:5)
<?php
$money = array(
'$50.45',
'USD 50.45',
'50,45',
'USD$ 50.45'
);
// remove everything except a digit "0-9", a comma ",", and a dot "."
$money = preg_replace('/[^\d,\.]/', '', $money);
// replace the comma with a dot, in the number format ",12" or ",43"
$money = preg_replace('/,(\d{2})$/', '.$1', $money);
print_r($money);
?>
输出:
Array
(
[0] => 50.45
[1] => 50.45
[2] => 50.45
[3] => 50.45
)
答案 1 :(得分:1)
preg_replace('/.*?(\d+)(?:[.,](\d+))?.*/', '\1.\2', $string);
答案 2 :(得分:1)
我提出的与您的示例一起使用的解决方案是:
preg_replace("([^0-9\.])","",str_replace(",",".",$val));
假设逗号只出现在应该是小数点时,而不是千位分隔符。它替换了带小数位的那些,然后从剩余的字符串中删除所有非数字/十进制字符。
测试脚本:
$inputs = array("\$50.45", "USD 50.45", "50,45", "USD\$ 50.45");
foreach ($inputs as $val) {
$cleanVal = preg_replace("([^0-9\.])","",str_replace(",",".",$val));
echo "GIVEN: <b>".$val."</b> -> CLEAN: <b>".$cleanVal."</b><br/>";
}
输出:
GIVEN:$ 50.45 - &gt;清洁:50.45
GIVEN:50.45美元 - &gt;清洁:50.45
GIVEN:50,45 - &gt;清洁:50.45
GIVEN:50.45美元 - &gt;清洁:50.45
答案 3 :(得分:0)
这也适用于给定的示例(demo):
$money = array(
'$50.45',
'USD 50.45',
'50,45',
'USD$ 50.45'
);
foreach ($money as $val) {
echo filter_var(
str_replace(',', '.', $val),
FILTER_SANITIZE_NUMBER_FLOAT,
FILTER_FLAG_ALLOW_FRACTION
), PHP_EOL;
}
// gives
// 50.45
// 50.45
// 50.45
// 50.45
当字符串包含分数和千位分隔符时,将失败。有一个过滤器标志FILTER_FLAG_ALLOW_THOUSAND
,它也可能处理千位分隔符。但是,由于千位分隔符可以指示其他语言环境中的分数,并且您希望将其考虑在内,因此它不会在您的方案中起作用。
要获得更强大的解析选择,请尝试
可以在PHP: unformat money中找到一个简单的例子。接受的答案中的示例代码仅解析50.45美元。 NumberFormatter可以配置其他规则,所以虽然我不是100%肯定,但我认为应该可以使用它。