用于验证货币编号格式的正则表达式

时间:2014-09-16 08:32:26

标签: javascript regex currency

我有以下格式,这是可以接受的

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.001,200,000.00的正确正则表达式是什么?因为我认为与\s\,的区别可以在同一个表达式中轻松完成。

谢谢。

2 个答案:

答案 0 :(得分:3)

要验证最后两个数字,您可以使用以下内容:

^-?\d{1,3}(?:[\s,]\d{3})*(?:\.\d+)?$
  1  2         3     4      5

Visualization

  1. 可选减号
  2. 1..3位数 零个或多个由
  3. 组成的片段
  4. 逗号或空格
  5. 3位数
  6. 可选的小数部分,由一个点后跟一个或多个数字组成。

答案 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);