【问题标题】:Regex for validating currency number format用于验证货币数字格式的正则表达式
【发布时间】:2014-09-16 08:32:25
【问题描述】:

我有以下格式,可以接受

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\, 的区别可以很容易地用同一个表达式来完成。

谢谢。

【问题讨论】:

  • 如何强制使用一种一致的格式,而不是编写过于复杂的逻辑来允许所有这些?
  • 这些是要求,我无法更改。
  • 我为此使用了 numeric.js
  • @johnSmith 这是一个很好的库(我假设),但它是用于应用正确的格式,而不是验证给定的。当然可能会有一个像startValue.apply(format) === startValue这样的hack,它可以告诉我们过去是否正确的格式,但它是一个hack IMO。

标签: javascript regex currency


【解决方案1】:

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

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

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

【讨论】:

  • 非常棒。出于某种原因,我试图使用前瞻来实现该结果。非常感谢。
  • 看来,我在逻辑上发现了一个小错误。看起来像regexr.com/39gu5,如果允许最后一部分根本不存在,则允许第二部分作为最后一部分。所以这将验证1 234,245,因为最后一部分验证为(?:[\s,]\d{3})*
【解决方案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);

【讨论】:

  • 这不是格式吗?或者您建议使用与我在之前评论中描述的格式相同的用法?
  • parseWeirdNumber 函数将正确解析您的所有示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 2012-11-30
  • 1970-01-01
相关资源
最近更新 更多