任何人都可以提供一种算法来检查输入字符串是否是正确形状和形式的十进制数?
正确形状和形式的规则:
- 最多两位小数。
- 出于所有实际目的,最大数字是 99,999,999.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
请抵制住提出 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(请注意,为了使结果清晰,我将这些组设为非捕获)。
Edit: Added [-+]?
子句允许负数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)