2011-09-19 65 views
1

对我而言,正则表达式对我来说一直是黑魔法,我从未能够在构建它们时感受到我的头脑。 我现在需要Reg Exp(用于验证处理),它检查用户是否按照以下规则输入数字。用于检测输入是否为格式化数字的正则表达式

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

VALID值的一些例子:

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

无效值:

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

'.5'或'1.'怎么样?只是为了确定,4.3E-7呢? –

+0

'蒂姆Pietzcker'没有得到你 – Vivekh

+0

如果用户写一个没有整数或小数部分的小数点,该怎么办? '.5'对于'0.5'是很常见的,在某些编程语言中使用'1'来强制'float'数据类型。 –

回答

3

可以尝试下面的表达式

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

说明:

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

没有为我工作 – Vivekh

+0

很好。我能想到的唯一情况是这不包括(病态)数字,例如'000,001.23'。并且在您的最新编辑中,空字符串也将被匹配。这可能也可能不是问题。 –

+0

@Vivekh:定义“没有工作”。 –

0

尝试使用这个表达式

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

没有千位分隔符像“1234”的数字被你的正则表达式拒绝。 – Howard

0

我知道你问一个正则表达式,但我认为这是更加健壮只是调用double.TryParse(),并考虑您的输入可以接受的,如果该方法返回true。

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

它不会准确地匹配您的测试用例;主要区别在于它对逗号非常宽松(所以它会接受两个INVALID输入)。

我不知道为什么你关心,但如果你真的要严格逗号,你可以做一个预处理步骤,你只检查逗号位置的有效性,然后调用double.TryParse()只如果字符串通过逗号分配测试。 (如果你想要非常小心,你必须尊重CultureInfo,这样你就可以知道分隔符使用的是什么字符,分隔符之间有多少位数,在你的程序找到的环境中)

这两种方法的结果都比正则表达式更“明显正确”。例如,您不必担心您的正则表达式会遗漏一些重要的案例,例如科学记数法。

+0

+1用于指出I18N问题。 – 2012-01-15 01:35:11

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将被视为有效。)如果您需要小数点后两位数字,请将正则表达式的结尾从+)?$更改为{2})?$

相关问题