正则表达式为多种格式小数和千位分隔符

时间:2014-07-31 16:09:10

标签: regex separator decimal-point

我需要正则表达式来验证一个可能包含千个分隔符的数字,这些分隔符可以是三个不同的字符之一(. ,)或小数,可以是{{1 }或,。没有最大值或最小值,因此这不是问题。如果小数不在数字中,则应添加。一旦检测到,我就能够将结果表达式处理成一套标准格式。

需要检测的示例值(左侧的值是将被检测到的值,右侧的值将是我们将编码的输出,但为了更好地理解我的需要,此处显示):

. => 11,111.11

11111.11 => 11'111.11

11111.11 => 11 111.11

11111.11 => 11.111,11

11111.11 => 11'111,11

11111.11 => 11 111,11

11111.11 => 11,111

11111.00 => 11'111

11111.00 => 11 111

11111.00 => 11.111

对于基于不同标准格式(取决于最终用户)输入值可能不同的网站,这是必需的。在瑞士,可以使用所有这些潜在的组合。

帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

你可以试试下面的片段,因为我没有看到如何使用单一的正则表达式实现这一点。

$string = array("0,89", "11,111,111,111", "11,111.11", "11'111.11", "11 111.11", "11.111,11", "11'111,11", "11 111,11", "11,111", "11'111", "11 111", "11.111");
$pattern = "/^(\d{1,3}([,\s.']\d{3})*|\d+)([.,]\d+)?$/";
foreach($string as $price){
    preg_match($pattern, $price, $matches);
    echo $matches[0] , " -> " , preg_replace("/[,\s.']/", "", $matches[1]) , ((!empty($matches[3])) ? preg_replace("/[,\s.']/", ".", $matches[3]) : ".00") , "<br />";
}

输出:

0,89 -> 0.89
11,111,111,111 -> 11111111111.00
11,111.11 -> 11111.11
11'111.11 -> 11111.11
11 111.11 -> 11111.11
11.111,11 -> 11111.11
11'111,11 -> 11111.11
11 111,11 -> 11111.11
11,111 -> 11111.00
11'111 -> 11111.00
11 111 -> 11111.00
11.111 -> 11111.00

如您所见,在第一步中,上述模式将匹配任何(有效)价格格式并将其分为三组。在第二步中,组(1)将被清除任何分隔符,而组(3)中的分隔符(如果存在)将被替换为点(。)(并且如果需要则将添加零)

如需更多测试,请查看demo

答案 1 :(得分:0)

只是为了澄清(不是作为“答案”,而是因为评论不允许这个答案的长度),这些是您打算遇到的输入类型吗?是否缺少任何场景?

编辑:分隔小数,添加了一些“无效”案例。

### WITH DECIMALS ###

# No separators, with decimals (using '.')
1.00    10.00   100.00  1000.00 10000.00    100000.00   1000000.00  10000000.00 100000000.00

# No separators, with decimals (using ',')
1,00    10,00   100,00  1000,00 10000,00    100000,00   1000000,00  10000000,00 100000000,00

# Thousand separators (using ','), with decimals (using '.')
1,000.00    10,000.00   100,000.00  1,000,000.00    10,000,000.00   100,000,000.00

# Thousand separators (using '.'), with decimals (using ',')
1.000,00    10.000,00   100.000,00  1.000.000,00    10.000.000,00   100.000.000,00

# Thousand separators (using ' '), with decimals (using ',')
1 000,00    10 000,00   100 000,00  1 000 000,00    10 000 000,00   100 000 000,00

# Thousand separators (using "'"), with decimals (using '.')
1'000.00    10'000.00   100'000.00  1'000'000.00    10'000'000.00   100'000'000.00

# Thousand separators (using "'"), with decimals (using ',')
1'000,00    10'000,00   100'000,00  1'000'000,00    10'000'000,00   100'000'000,00


### WITHOUT DECIMALS ###

# No separators, no decimals
1   10  100 1000    10000   100000  1000000 10000000    100000000

# Thousand separators (using ','), no decimals
1,000   10,000  100,000 1,000,000   10,000,000  100,000,000

# Thousand separators (using '.'), no decimals
1.000   10.000  100.000 1.000.000   10.000.000  100.000.000

# Thousand separators (using ' '), no decimals
1 000   10 000  100 000 1 000 000   10 000 000  100 000 000

# Thousand separators (using "'"), no decimals
1'000   10'000  100'000 1'000'000   10'000'000  100'000'000


### INVALID, reusing separator and decimal indicator ###

1,000,00 10,000,00 100,000,00 1,000,000,00 10,000,000,00 100,000,000,00
1.000.00 10.000.00 100.000.00 1.000.000.00 10.000.000.00 100.000.000.00


### INVALID, non-numeric input or invalid separators ###

11a111.11
1-000 1-000.00 1-000,00 100!000.00