对我而言,正则表达式对我来说一直是黑魔法,我从未能够在构建它们时感受到我的头脑。 我现在需要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
对我而言,正则表达式对我来说一直是黑魔法,我从未能够在构建它们时感受到我的头脑。 我现在需要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
可以尝试下面的表达式
^([1-9]\d{0,2}(,\d{3})+|[1-9]\d*|0)(\.\d+)?$
说明:
没有为我工作 – Vivekh
很好。我能想到的唯一情况是这不包括(病态)数字,例如'000,001.23'。并且在您的最新编辑中,空字符串也将被匹配。这可能也可能不是问题。 –
@Vivekh:定义“没有工作”。 –
尝试使用这个表达式
^(\d{1,3}[,](\d{3}[,])*\d{3}(\.\d{1,3})?|\d{1,3}(\.\d+)?)$
没有千位分隔符像“1234”的数字被你的正则表达式拒绝。 – Howard
我知道你问一个正则表达式,但我认为这是更加健壮只是调用double.TryParse(),并考虑您的输入可以接受的,如果该方法返回true。
double dummy;
var isValid=double.TryParse(text, out dummy);
它不会准确地匹配您的测试用例;主要区别在于它对逗号非常宽松(所以它会接受两个INVALID输入)。
我不知道为什么你关心,但如果你真的要严格逗号,你可以做一个预处理步骤,你只检查逗号位置的有效性,然后调用double.TryParse()只如果字符串通过逗号分配测试。 (如果你想要非常小心,你必须尊重CultureInfo,这样你就可以知道分隔符使用的是什么字符,分隔符之间有多少位数,在你的程序找到的环境中)
这两种方法的结果都比正则表达式更“明显正确”。例如,您不必担心您的正则表达式会遗漏一些重要的案例,例如科学记数法。
+1用于指出I18N问题。 – 2012-01-15 01:35:11
^(((([1-9][0-9]{0,2})(,[0-9]{3})*)|([0-9]+)))?(\.[0-9]+)?$
这适用于所有有效数据的示例,并且还会接受以小数点开头的小数点。 (即,例如,.61
,.07
等)
我注意到有效小数的所有示例(1.23
,1,234.56
和1,234,567.89
)在小数点后都有两位数字。我不确定这是否是巧合,或者如果您确实需要小数点后两位数字。 (也就是说,您可能正在使用金钱价值。)正如我写的正则表达式适用于小数点后的任意数字。 (例如,1.2345
和1,234.56789
将被视为有效。)如果您需要小数点后两位数字,请将正则表达式的结尾从+)?$
更改为{2})?$
。
'.5'或'1.'怎么样?只是为了确定,4.3E-7呢? –
'蒂姆Pietzcker'没有得到你 – Vivekh
如果用户写一个没有整数或小数部分的小数点,该怎么办? '.5'对于'0.5'是很常见的,在某些编程语言中使用'1'来强制'float'数据类型。 –