Php 这是一个多么快速的清理货币链的方法啊
可能重复:Php 这是一个多么快速的清理货币链的方法啊,php,regex,Php,Regex,可能重复: 如何摆脱一切不是数字或点的东西,用一个简单的正则表达式将,替换为 示例: $50.45 = 50.45 USD 50.45 = 50.45 50,45 = 50.45 USD$ 50.45 = 50.45 我提出的解决方案适用于您的示例: preg_replace("([^0-9\.])","",str_replace(",",".",$val)); 假设逗号只有在应该是小数点时
如何摆脱一切不是数字或点的东西,用一个简单的正则表达式将
,
替换为
示例:
$50.45 = 50.45
USD 50.45 = 50.45
50,45 = 50.45
USD$ 50.45 = 50.45
我提出的解决方案适用于您的示例:
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/>";
}
$inputs=数组(“\$50.45”、“USD 50.45”、“50,45”、“USD\$50.45”);
foreach($val形式的输入){
$cleanVal=preg_replace(([^0-9\.]),“”,str_replace(“,”,“,$val));
echo“给定:.$val.”->CLEAN:.$cleanVal.
;
}
输出:
Array
(
[0] => 50.45
[1] => 50.45
[2] => 50.45
[3] => 50.45
)
给定:$50.45->清洁:50.45
给定:50.45美元->清洁:50.45美元
给定值:50,45->清洁值:50.45
给定:50.45美元->清洁:50.45美元
这对于给定的示例()也适用: 当字符串包含分数和千个分隔符时,将失败。有一个filter flag
filter\u flag\u ALLOW\u thoun
,它也可能处理1000个分隔符。但是,由于千分隔符可以表示其他地区的分数,并且您希望将其考虑在内,因此它在您的场景中不起作用
要获得更强大的解析替代方案,请尝试
一个简单的例子可以在中找到。不过,接受答案中的示例代码将只解析$50.45。NumberFormatter可以配置其他规则,因此虽然我不是100%确定,但我认为它应该是可能的。像“50 foo bar 45”这样的无意义数据呢?@wonk0我认为这将得到第一个50,因此字符串可以以“USD”和/或“$”开头,后跟数字;可选后跟“,”或“,”后接更多数字?@Gordon我不想翻译货币,服务只收美元。
3050.39美元
?谢谢,但是54美元
返回1.2
@David您必须使用特殊版本的PHP。看这把小数点放在数字后面,即使后面什么都没有。。。可能是rtrim(preg_replace('/.*?(\d+)([,](\d+)))、'\1.\2',$string),'
?@Brendan如果这是个问题,你也可以将它转换成浮点,然后使用(string)(float)preg…
。嗨@Artefactor-如果你有时间,你能解释一下你的正则表达式吗?谢谢,但不适用于1799美元。00美元为1.799美元。00@malhal固定的。现在应该可以了。:)不起作用,试试5000.45美元,它提供了5000.45万个分隔符。在任何基于web的解决方案中,都确实需要对分隔符的支持。对不起,我投票否决了您。@malhal是的,我明确声明代码段不能使用1000个分隔符。我提供了两种可能的解决方法。你试过那些吗?
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/>";
}
$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