正则表达式,用于检测输入是否为格式化数字

时间:2011-09-19 13:36:00

标签: c# asp.net regex

正则表达式对我来说似乎总是黑魔法,我从来没有能够自己动手制作它们。 我现在需要一个Reg Exp(用于验证putops),它根据以下规则检查用户输入的数字。

  • 没有字母字符
  • 可以有小数
  • 可以有数千个逗号,但必须正确放置逗号

VALID值的一些示例:

1.23
100
1,234
1234
1,234.56
0.56
1,234,567.89

INVALID值:

1.ab
1,2345.67
0,123.45
1.24,687

4 个答案:

答案 0 :(得分:3)

您可以尝试以下表达式

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

说明:

  • 该点之前的部分由
    • 1-3个数字后跟(一个或多个)逗号加三个数字
    • 或只是数字(至少一个)
  • 如果然后跟着一个点也必须跟随一些数字。

答案 1 :(得分:1)

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

这适用于所有有效数据示例,并且还接受以小数点开头的小数。 (即.61.07等。)

我注意到所有有效小数的示例(1.231,234.561,234,567.89)在小数点后都有两位数。我不确定这是否是巧合,或者你是否确实要求小数点后正好两位数。 (也就是说,你可能正在处理金钱价值。)我写的正则表达式适用于小数点后的任意位数。 (即1.23451,234.56789将被视为有效。)如果您需要在小数点后面恰好有两位数,请将正则表达式的结尾从+)?$更改为{{1 }}

答案 2 :(得分:0)

尝试使用此正则表达式

^(\d{1,3}[,](\d{3}[,])*\d{3}(\.\d{1,3})?|\d{1,3}(\.\d+)?)$

答案 3 :(得分:0)

我知道你要求一个正则表达式,但我认为只要调用double.TryParse()并且如果该方法返回true,则认为你的输入是可接受的。

double dummy;
var isValid=double.TryParse(text, out dummy);

它与您的测试用例完全不符;主要区别在于它对逗号很宽松(所以它会接受两个INVALID输入)。

我不确定你为什么关心,但如果你真的想要逗号严格,你可以做一个预处理步骤,你只检查逗号位置的有效性,然后调用double.TryParse()仅当字符串通过逗号放置测试时。 (如果你想要真正小心,你必须尊重CultureInfo,这样你才能知道分隔符使用了什么字符,以及分隔符之间有多少位数,在你的程序发现自己的环境中)

任何一种方法都会导致代码比正则表达式更“明显正确”。例如,你不必担心你的正则表达式遗漏了一些重要的案例,比如科学记法。