什么是快速清理货币字符串的方法

时间:2011-07-12 09:34:51

标签: php regex

  

可能重复:
  PHP: unformat money

如何摆脱不是数字或点的所有内容,使用轻型正则表达式将,替换为.

示例:

$50.45     = 50.45
USD 50.45  = 50.45
50,45      = 50.45
USD$ 50.45 = 50.45

4 个答案:

答案 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%肯定,但我认为应该可以使用它。