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

本文关键字:有效 十进制数 是否 输入 字符串 验证 | 更新日期: 2023-09-27 17:55:15

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

正确形状和形式的规则:

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

正确形状和形式的示例:

1,234,567.89//英式风格1.234.567,89//法式风格1 234 567,89//德国风格1234567.89//英文数学风格1234567,89//欧洲数学风格12.0012.012

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

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

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

以下是我会使用的模式:

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(请注意,为了结果的清晰性,我使组不捕获)。

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

将此简单正则表达式用于精度为 2 的小数点

如果保证会有小数部分,那么一种方法是:

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);

如果小数部分是可选的,我不确定您是否可以明确解析这种格式。