十进制数字验证的正则表达式

时间:2014-07-21 17:51:08

标签: c# regex

C#数据注释的正则表达式,用于验证具有以下条件的可选十进制数

  • 以0-9之间的任何数字开头的最多十一位数(在前导零数应为11之后)
  • 最多11位数,小数点以0-9之间的任何数字开头,计数为 小数不应超过11
  • 它不能只是一个零
  • 整数中只允许一位小数,但不需要小数

示例:

12345678910
10.3
0.02
18.2578
012345678.9 
0.123456789 
012345678912 (since lead zero doesn't count as a valid number count 
              of max 11 is after zeor)
0.123456789 (since this number has decimal lead zero counts to the 
             total 11 digit count)
0.001

到目前为止,我已经提出了类似^(?=.{1,11}$)([1-9][0-9]*|0)(\\.[0-9]*[1-9])?$的内容,但这并不适用于所有情况

这就是我设置数据注释的方式

 [RegularExpression(@"(?<![.\d])0*(?:[1-9][0-9]{10}|(?![0-9.]{14})(?:0\.[0-9]*[1-9][0-9]*|[1-9][0-9]*\.[0-9]+))(?![0-9.])\z", ErrorMessage = "Invalid {0}")]
        public decimal Quantity { get; set; }

3 个答案:

答案 0 :(得分:0)

用于验证可能的浮点数的IMHO正则表达式是非常低效的,因为您正在调用比作业所需的大得多的解析器。

最好使用Convert类并使用方法ToDecimalToDouble抛出FormatException例外

答案 1 :(得分:0)

您可以使用此模式:

\A0*(?:[1-9][0-9]{0,10}|(?![0-9.]{12})(?:0\.[0-9]*[1-9][0-9]*|[1-9][0-9]*\.[0-9]+))\z

细节:

\A                            # start of the string anchor
0*                            # ignored leading zeros
(?:
    [1-9][0-9]{0,10}            # integer
  |
    (?![0-9.]{12})            # 11 characters max for decimal numbers
    (?:
        0\.[0-9]*[1-9][0-9]*  # decimal numbers < 1
      |
        [1-9][0-9]*\.[0-9]+   # decimal numbers >= 1
    )
)
\z                            # end of the string anchor

online demo

代码示例:

string text = "1.1231231";
string pat = @"
    \A                            # start of the string anchor
    0*                            # ignored leading zeros
    (?:
        [1-9][0-9]{0,10}          # integer numbers
      |
        (?![0-9.]{12})            # 11 characters max for decimal numbers
        (?:
            0\.[0-9]*[1-9][0-9]*  # decimal numbers < 1
          |
            [1-9][0-9]*\.[0-9]+   # decimal numbers >= 1
        )
    )
    \z                            # end of the string anchor
";

Regex r = new Regex(pat, RegexOptions.IgnorePatternWhitespace);

Match m = r.Match(text);

if (m.Success) {
    /* OK */
} else {
   /* FAIL */
}

使用数据注释:

[RegularExpression(@"^(?:[1-9][0-9]{0,10}|(?![0-9.]{12})(?:0\.[0-9]*[1-9][0-9]*|[1-9][0-9]*\.[0-9]+))$", 
  ErrorMessage="Invalid number!")]

答案 2 :(得分:0)

这应该匹配所有内容,但最大长度

0*[1-9]+[0-9]*(?:[.][\d]+)?|0+[.][\d]+