【问题标题】:Validate currency amount using regular expressions in JavaScript [duplicate]使用 JavaScript 中的正则表达式验证货币金额 [重复]
【发布时间】:2011-05-31 16:00:24
【问题描述】:

可能重复:
What's a C# regular expression that'll validate currency, float or integer?

如何在 JavaScript 中使用正则表达式验证货币金额?

小数分隔符: ,

十、百等分隔符: .

模式: ###.###.###,##

有效金额示例:

1
1234
123456

1.234
123.456
1.234.567

1,23
12345,67
1234567,89

1.234,56
123.456,78
1.234.567,89

编辑

我忘了说下面的模式也是有效的:###,###,###.##

【问题讨论】:

标签: javascript regex currency


【解决方案1】:

仅根据您给出的标准,这就是我想出的。

/(?:^\d{1,3}(?:\.?\d{3})*(?:,\d{2})?$)|(?:^\d{1,3}(?:,?\d{3})*(?:\.\d{2})?$)/

http://refiddle.com/18u

这很丑陋,当你发现更多需要匹配的案例时,它只会变得更糟。您最好找到并使用一些验证库,而不是自己尝试做这一切,尤其是不要在单个正则表达式中。

已更新以反映增加的要求。


再次更新下面的评论。

它将匹配123.123,123(三个尾随数字而不是两个),因为它将接受逗号或句点作为千位和小数分隔符。为了解决这个问题,我现在基本上把表达式加倍了;要么用逗号作为分隔符,用句点作为小数点来匹配整个事物,要么用句点作为分隔符,用逗号作为小数点来匹配整个事物。

明白我的意思是它变得更乱了吗? (^_^)


详细解释如下:

(?:^           # beginning of string
  \d{1,3}      # one, two, or three digits
  (?:
    \.?        # optional separating period
    \d{3}      # followed by exactly three digits
  )*           # repeat this subpattern (.###) any number of times (including none at all)
  (?:,\d{2})?  # optionally followed by a decimal comma and exactly two digits
$)             # End of string.
|              # ...or...
(?:^           # beginning of string
  \d{1,3}      # one, two, or three digits
  (?:
    ,?         # optional separating comma
    \d{3}      # followed by exactly three digits
  )*           # repeat this subpattern (,###) any number of times (including none at all)
  (?:\.\d{2})? # optionally followed by a decimal perioda and exactly two digits
$)             # End of string.

让它看起来更复杂的一件事是里面的所有?:。通常,正则表达式也会捕获(返回匹配项)所有子模式。 ?: 所做的只是说不费心去捕获子模式。所以从技术上讲,如果你把所有的 ?: 拿出来,完整的东西仍然会匹配你的整个字符串,这看起来更清晰一些:

/(^\d{1,3}(\.?\d{3})*(,\d{2})?$)|(^\d{1,3}(,?\d{3})*(\.\d{2})?$)/

另外,regular-expressions.info 是一个很好的资源。

【讨论】:

  • 在我接受您的回答之前,您能否更新正则表达式使其不接受超过两位小数?示例:123.456,789
  • @Diogo 好电话,看看我的更新。
  • 能否请您更新以下详细的正则表达式:pastebin.com/2heBURP7
  • @Diogo 喜欢这个? pastebin.com/at8hhuUt 让它看起来更复杂的一件事是里面的所有?:。通常,正则表达式也会捕获(返回匹配项)所有子模式。 ?: 所做的只是说不费心去捕获子模式。所以从技术上讲,如果你把它们都拿出来,它仍然会匹配你的整个字符串,这看起来更清楚一点:/(^\d{1,3}(\.?\d{3})*(,\d{2})?$)|(^\d{1,3}(,?\d{3})*(\.\d{2})?$)/
【解决方案2】:

这适用于您的所有示例:

/^(?:\d+(?:,\d{3})*(?:\.\d{2})?|\d+(?:\.\d{3})*(?:,\d{2})?)$/

作为一个冗长的正则表达式(但在 JavaScript 中不支持):

^              # Start of string
(?:            # Match either...
 \d+           # one or more digits
 (?:,\d{3})*   # optionally followed by comma-separated threes of digits
 (?:\.\d{2})?  # optionally followed by a decimal point and exactly two digits
|              # ...or...
 \d+           # one or more digits
 (?:\.\d{3})*  # optionally followed by point-separated threes of digits
 (?:,\d{2})?   # optionally followed by a decimal comma and exactly two digits
)              # End of alternation
$              # End of string.

【讨论】:

  • +1 用于解释正则表达式的每个部分,否则他们有能力灼伤你的眼睛。
  • +1 同意巴里。感谢您添加此内容。在要求和我的答案最终确定后,我打算这样做,但你打败了我。
【解决方案3】:

除了(刚刚添加的?)123.45 案例之外,这将处理上述所有内容:

function foo (s) { return s.match(/^\d{1,3}(?:\.?\d{3})*(?:,\d\d)?$/) }

您需要处理多种分隔符格式吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多