【问题标题】:validate decimal with decimal separator and thousand separator使用小数分隔符和千位分隔符验证小数
【发布时间】:2013-11-07 14:16:59
【问题描述】:

您好,我使用此正则表达式验证带有小数分隔符和千位分隔符的数字

ets = "\\,";
eds = "\\.";
"^([+\\-]?[0-9" + ets + "]*(" + eds + "[0-9]*)?)$"

但是对于我的两个单元测试用例,这个fail(它不应该接受),

12.1,,2,有人可以帮忙吗?

注意:这项工作适用于1..2

【问题讨论】:

  • 你能说更多吗?你试过什么?
  • 您是否考虑将 1,,2 和 12 作为您希望匹配的字符串?

标签: java regex


【解决方案1】:

让我们看看实际使用的正则表达式:

^([+\-]?[0-9\,]*(\.[0-9]*)?)$

这匹配12.,因为您的第二部分是(\.[0-9]*)。请注意,* 表示零或多个,因此数字是可选的。

这也匹配1,,2,因为您在第一个字符类[0-9\,] 中包含了逗号。所以实际上你的正则表达式也会匹配,,,,,,,,


这可以在没有正则表达式的情况下解决,但是如果您需要一个正则表达式,您可能需要这样的东西:

^[+-]?[0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)?$

分解:

^ # match start of string
 [+-]? # matches optional + or - sign
 [0-9]{1,3} # match one or more digits 
 (,[0-9]{3})* # match zero or more groups of comma plus three digits
 (\. # match literal dot
  [0-9]+ # match one or more digits
 )? # makes the decimal portion optional
$ # match end of string

要在 Java 中使用它,您需要类似:

ets = ","; // commas don't need to be escaped
eds = "\\."; // matches literal dot

regex = "^[+-]?[0-9]{1,3}(" + ets + "[0-9]{3})*(" + eds + "[0-9]+)?$"

【讨论】:

  • 嗨,你能把逗号“,”设为可选吗?这对除2000 之外的所有内容都非常有用。它说 2000 不是小数,但如果我输入 2,000,则它通过验证。非常感谢
  • 您可以在逗号后添加? 使其成为可选。在我上面的正则表达式的情况下,使用"^[+-]?[0-9]{1,3}(" + ets + "?[0-9]{3})*(" + eds + "[0-9]+)?$"
【解决方案2】:

如果我理解正确, 12. 匹配是因为您匹配 0 或 1 次出现(一个句点,然后是 0 到 9 之间任意数字的 0 次或多次出现)。所以你可能有一个时期,而它前面什么都没有。

1,,2 匹配,因为您要匹配 0 到 9 之间的任何字符或逗号的 0 次或多次出现。因此你可以有 0,,,,,,,,,,,,,,0.

如果您不希望最后一个数字匹配,请确保逗号前最多只能有 3 个数字(在千位分隔符中),使用花括号表示允许的出现次数(即 {0,3})在一组数字之后。

[0-9]{0,3},

@NullUserException 刚刚给出了一个完整的正则表达式,适合您的意图

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多