C# 验证输入字符串是否为有效的十进制数

C# 验证输入字符串是否为有效的十进制数,c#,C#,有谁能提供一种算法来检查输入字符串的形状和形式是否正确 正确形状和形式的规则: 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 最多两位小数 在实际应

有谁能提供一种算法来检查输入字符串的形状和形式是否正确

正确形状和形式的规则:

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
  • 最多两位小数
  • 在实际应用中,最大的数字是9999999.99
  • 整数部分可以使用空格、逗号或点作为组分隔符
  • 小数部分可以使用逗号或点作为分隔符
  • 正确形状和形式的示例:

    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 1234567.89//英语风格 1.234.567,89//法式风格 1234 567,89//德国风格 1234567.89//英语数学风格 1234567,89//欧洲数学风格 12 12 12
    请抵制提出Decimal.Parse或Decimal.TryParse的诱惑。这两种方法都愉快地接受诸如“1,2,3,4”之类的字符串,这不是我想要的。

    使用此方法如果保证有小数部分,则一种方法是:

    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);
    
    如果小数部分是可选的,我不确定您是否可以明确地解析此格式。

    ,并且执行此操作的正则表达式将比您想象的更复杂。我强烈建议为每种风格设置一个单独的正则表达式——不是因为它不能在一行中完成,而是因为这一行的一行将非常大,并且很难维护

    以下是我将使用的模式:

    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进行测试:(注意,为了结果的清晰性,我将组设置为非捕获)


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

    听起来你想写一个正则表达式,这是“正确的形状和形式”的唯一示例?请你定义规则。举几个例子并不能说明具体情况。另外,如果你问了9个问题,你现在至少应该接受一个。根据你的要求,1,2,3,4似乎是有效的。我很惊讶解析方法不尊重数字格式组的大小。您的算法如何处理字符串,如“1,2,3,80”?你的算法是否认为字符串是十进制数的有效表示?@贾斯廷摩根?短模式不能识别诸如“0”、“0”、“0、00”、“0、0”等字符串。这意味着小数点或逗号左边的一个数字。这适用于“10.00”,10,00.@justin morgan--字符串,如“0.00”,“0.0”,“0,00”,“0,0”。这意味着小数点或逗号左边有一个零。@justin morgan--这是一个非常蹩脚的注释系统。无法编辑。总之,长模式的另一个问题是:字符串,如“0000,00”或“0000.00”“@user669226-但是如果你愿意,他们可以被禁止;让我知道,我可以编辑。就我个人而言,我会将它们保留在其中,因为0000.00作为输入是非常可行的,并且格式正确。@user669226-之前的模式故意不允许前导零。我继续编辑,因为我更喜欢更简单的表单,而且我觉得它更正确。另一种形式主要是为了说明如果您想这样做,如何禁止前导零。请注意,现在允许123456.789的数字,但我会认为正确的行为。