验证输入字符串是有效的十进制数

use*_*226 3 c#

任何人都可以提供一种算法来检查输入字符串是否是正确形状和形式的十进制数字?

正确形状和形式的规则:

  1. 最多两位小数.
  2. 出于所有实际目的,最大数量是99,999,999.99
  3. 整数部分可以使用空格,逗号或点作为组分隔符.
  4. 小数部分可以使用逗号或点作为分隔符.

正确的形状和形式的例子:

1,234,567.89   // English style
1.234.567,89   // French style
1 234 567,89   // German style
1234567.89     // English mathematical style
1234567,89     // European mathematical style
12.00
12.0
12

请抵制你提出Decimal.Parse或Decimal.TryParse的诱惑.两种方法都快乐地接受诸如"1,2,3,4"之类的字符串,这不是我想要的.

Jus*_*gan 5

我星期五回答了一个非常类似的问题,这样做的正则表达式会比你想象的要复杂得多.我强烈建议为每种风格设置一个单独的正则表达式 - 不是因为它不能在一行中完成,而是因为这样的单线程将会很大并且很难维护.

以下是我使用的模式:

English: ^[-+]?\d{1,3}(,\d{3})*(\.\d+)?$
French: ^[-+]?\d{1,3}(\.\d{3})*(,\d+)?$
German: ^[-+]?\d{1,3}(\s\d{3})*(,\d+)?$
English mathematical: ^[-+]?\d+(\.\d+)?$
European mathematical: ^[-+]?\d+(,\d+)?$
Run Code Online (Sandbox Code Playgroud)

这些可以组合成如下:

^[-+]?(\d{1,3}((,\d{3})*(\.\d+)?|([.\s]\d{3})*(,\d+)?)|\d+([,\.]\d+)?)$
Run Code Online (Sandbox Code Playgroud)

希望单线对你来说是可怕的.这是一项非常常见的重要任务,但它也是一个比它看起来更复杂的任务.

使用您的示例输入在Rubular上进行测试:http://rubular.com/r/Dipvyrf6C8 (请注意,为了清晰起见,我使组无法捕获).

编辑:添加[-+]?子句以允许负数.