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 12C# 验证输入字符串是否为有效的十进制数,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 最多两位小数 在实际应
请抵制提出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的数字,但我会认为正确的行为。