2011-05-08 190 views
3

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

规则正确的形状和形式:

  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”,这不是我想要的。

+1

听起来像你想写一个正则表达式 – 2011-05-08 12:49:20

+1

那些只有*正确的形状和形式的例子吗? – 2011-05-08 12:49:52

+0

请您定义规则。给出一些例子没有规范。 – 2011-05-08 13:01:23

回答

5

I answered a very similar question on Friday,这样做的正则表达式会比您想象的更复杂。我强烈建议为每种风格设置一个单独的正则表达式 - 这并不是因为它不能在一行中完成,而是因为这样的单行表达式会很大并且很难维护。

下面是模式我会用:

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+)?$ 

这些可以组合成类似:

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

希望这一个班轮适当可怕的给你。这是一个非常常见,重要的任务,但它也比看起来更复杂。

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

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

+0

@justin morgan ---短格式无法识别字符串,如“0.00”,“0.0”,“0,00”,“0,0”。这意味着小数点或逗号左侧的单个数字。这是“10.00”,10,00“。 – user669226 2011-05-09 09:13:33

+0

@justin morgan ---诸如”0.00“,”0.0“,”0,00“,”0,0“等字符串。左边的小数点或逗号 – user669226 2011-05-09 11:33:40

+0

@justin morgan ---这是一个非常蹩脚的评论系统,无法编辑,不管怎样,长模式的另一个问题是:字符串如“0000,00”或“0000.00” – user669226 2011-05-09 11:46:57

0

如果它保证有是一个小数部分,然后做一个方式,它是:

var s = "1 334 567,80"; 
var decimalPart = s.Split(',', '.').Last(); 
var integerPart = s.Substring(0, s.Length - decimalPart.Length - 1); 
integerPart = integerPart.Replace(",", string.Empty).Replace(".", string.Empty) 
         .Replace(" ", string.Empty); 

var decimalValue = decimal.Parse(integerPart + "." + decimalPart, 
           CultureInfo.InvariantCulture); 

如果小数部分是可选的,我是不知道你是否可以毫不含糊地解析这种格式。

+0

你的算法如何处理诸如“1,2,3,80”之类的字符串?您的算法是否将字符串视为十进制数的有效表示? – user669226 2011-05-08 13:44:21

相关问题