Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 这是一个多么快速的清理货币链的方法啊_Php_Regex - Fatal编程技术网

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