我有以下格式,这是可以接受的
1200000,00
1200000.00
1,200,000.00
1 200 000.00
1 200 000,00
1 200 000,0000
-1 200 000.00
目前,我只能验证^-?\\d+$
,^-?\\d+[\\,\\.]\\d{2}$
,^-?\\d+[\\,\\.]\\d{2,}$
。最后两种格式是分开的,所以我知道是否需要舍入。所有这三种格式都使用gm
标记来检查从开始^
到结束$
的字符串。
这些正则表达式仅涵盖列表中的前两个元素。使用逗号和空格进行千分离的其他元素尚未验证,我不确定如何实现。
还有一个"美化"表达式(\\d)(?=(\\d{3})+(?!\\d))
,将使用此1200000,00
并将其转换为1 200 000,00
,并使用'1200000,00'.replace(('(\\d)(?=(\\d{3})+(?!\\d))', 'g'), '$1 ')
。
所以问题陈述,验证这种格式1 200 000.00
或1,200,000.00
的正确正则表达式是什么?因为我认为与\s\,
的区别可以在同一个表达式中轻松完成。
谢谢。
答案 0 :(得分:3)
要验证最后两个数字,您可以使用以下内容:
^-?\d{1,3}(?:[\s,]\d{3})*(?:\.\d+)?$
1 2 3 4 5
答案 1 :(得分:2)
由于我的误读,这并没有直接解决问题。但它可能仍然对某人有用,所以我会留下来。
停止尝试用正则表达式解决所有问题。当你有一个或两个非常好定义的字符串时,正则表达式很棒。不是一百万种格式。
这可以通过最小的正则表达式来解决。魔术是大胆的。
var numbers = [
"1200000,00",
"1200000.00",
"1,200,000.00",
"1 200 000.00",
"1 200 000,00",
"1 200 000,0000",
"-1 200 000.00"
];
var parseWeirdNumber = function(numberString) {
//Split numbers to parts. , . and space are all valid delimiters.
var numberParts = numberString.split(/[.,\s]/);
//Remove the last part. **This means that all input must have fraction!!**
var fraction = numberParts.pop();
//Rejoin back without delimiters, and reapply the fraction.
//parseFloat to convert to a number
var number = parseFloat(numberParts.join('') + "." + fraction);
return number;
}
numbers = numbers.map(parseWeirdNumber);
console.log(numbers);