十进制数的正则表达式

dav*_*orn 31 c# regex decimal

我需要验证textbox输入,并且只能允许十进制输入,如:( X,XXX十进制符号前只有一位数,精度为3).

我正在使用C#试试这个^[0-9]+(\.[0-9]{1,2})?$

J-1*_*DiZ 55

^[0-9]([.,][0-9]{1,3})?$
Run Code Online (Sandbox Code Playgroud)

它允许:

0
1
1.2
1.02
1.003
1.030
1,2
1,23
1,234
Run Code Online (Sandbox Code Playgroud)

但不是:

.1
,1
12.1
12,1
1.
1,
1.2345
1,2345
Run Code Online (Sandbox Code Playgroud)

  • 用\ d替换[0-9]会删除3个字符(总共6个字符)并执行相同的操作. (7认同)
  • +1但接受.1是不是很好,因为这是0.1的有效表示(用Decimal.Parse测试)? (2认同)

Ric*_*ard 21

还有另外一种方法,它不具有本地化和全球化问题(允许""或者但不能同时"") Decimal.TryParse.

试试转换,忽略价值.

bool IsDecimalFormat(string input) {
  Decimal dummy;
  return Decimal.TryParse(input, out dummy);
}
Run Code Online (Sandbox Code Playgroud)

这比使用正则表达式快得多,见下文.

(过载Decimal.TryParse可用于更精细的控制.)


性能测试结果:Decimal.TryParse:0.10277ms,正则表达式:0.49143ms

代码(PerformanceHelper.Run是一个帮助程序,而不是为传递的迭代计数运行委托并返回平均值TimeSpan.):

using System;
using System.Text.RegularExpressions;
using DotNetUtils.Diagnostics;

class Program {
    static private readonly string[] TestData = new string[] {
        "10.0",
        "10,0",
        "0.1",
        ".1",
        "Snafu",
        new string('x', 10000),
        new string('2', 10000),
        new string('0', 10000)
    };

    static void Main(string[] args) {
        Action parser = () => {
            int n = TestData.Length;
            int count = 0;
            for (int i = 0; i < n; ++i) {
                decimal dummy;
                count += Decimal.TryParse(TestData[i], out dummy) ? 1 : 0;
            }
        };
        Regex decimalRegex = new Regex(@"^[0-9]([\.\,][0-9]{1,3})?$");
        Action regex = () => {
            int n = TestData.Length;
            int count = 0;
            for (int i = 0; i < n; ++i) {
                count += decimalRegex.IsMatch(TestData[i]) ? 1 : 0;
            }
        };

        var paserTotal = 0.0;
        var regexTotal = 0.0;
        var runCount = 10;
        for (int run = 1; run <= runCount; ++run) {
            var parserTime = PerformanceHelper.Run(10000, parser);
            var regexTime = PerformanceHelper.Run(10000, regex);

            Console.WriteLine("Run #{2}: Decimal.TryParse: {0}ms, Regex: {1}ms",
                              parserTime.TotalMilliseconds, 
                              regexTime.TotalMilliseconds,
                              run);
            paserTotal += parserTime.TotalMilliseconds;
            regexTotal += regexTime.TotalMilliseconds;
        }

        Console.WriteLine("Overall averages: Decimal.TryParse: {0}ms, Regex: {1}ms",
                          paserTotal/runCount,
                          regexTotal/runCount);
    }
}
Run Code Online (Sandbox Code Playgroud)


Unk*_*ech 8

\d{1}(\.\d{1,3})?

Match a single digit 0..9 «\d{1}»
   Exactly 1 times «{1}»
Match the regular expression below and capture its match into backreference number 1 «(\.\d{1,3})?»
   Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
   Match the character “.” literally «\.»
   Match a single digit 0..9 «\d{1,3}»
      Between one and 3 times, as many times as possible, giving back as needed (greedy) «{1,3}»


Created with RegexBuddy
Run Code Online (Sandbox Code Playgroud)

比赛:
1
1.2
1.23
1.234


SK9*_*SK9 5

一般来说,即无限的小数位:

^-?(([1-9]\d*)|0)(.0*[1-9](0*[1-9])*)?$