我需要正则表达式来验证一个可能包含千个分隔符的数字,这些分隔符可以是三个不同的字符之一(.
,
或)或小数,可以是{{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
对于基于不同标准格式(取决于最终用户)输入值可能不同的网站,这是必需的。在瑞士,可以使用所有这些潜在的组合。
帮助将不胜感激。
答案 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