Fastest way to check if string contains only digits

后端 未结 20 855
挽巷
挽巷 2020-12-04 09:07

I know a few ways how to check this. regex,int.parse,tryparse,looping.

can anyone tell me what is the fastest way to check?

the nee

20条回答
  •  旧巷少年郎
    2020-12-04 09:48

    If you are concerned about performance, use neither int.TryParse nor Regex - write your own (simple) function (DigitsOnly or DigitsOnly2 below, but not DigitsOnly3 - LINQ seems to incur a significant overhead).

    Also, be aware that int.TryParse will fail if the string is too long to "fit" into int.

    This simple benchmark...

    class Program {
    
        static bool DigitsOnly(string s) {
            int len = s.Length;
            for (int i = 0; i < len; ++i) {
                char c = s[i];
                if (c < '0' || c > '9')
                    return false;
            }
            return true;
        }
    
        static bool DigitsOnly2(string s) {
            foreach (char c in s) {
                if (c < '0' || c > '9')
                    return false;
            }
            return true;
        }
    
        static bool DigitsOnly3(string s) {
            return s.All(c => c >= '0' && c <= '9');
        }
    
        static void Main(string[] args) {
    
            const string s1 = "916734184";
            const string s2 = "916734a84";
    
            const int iterations = 1000000;
            var sw = new Stopwatch();
    
            sw.Restart();
            for (int i = 0 ; i < iterations; ++i) {
                bool success = DigitsOnly(s1);
                bool failure = DigitsOnly(s2);
            }
            sw.Stop();
            Console.WriteLine(string.Format("DigitsOnly: {0}", sw.Elapsed));
    
            sw.Restart();
            for (int i = 0; i < iterations; ++i) {
                bool success = DigitsOnly2(s1);
                bool failure = DigitsOnly2(s2);
            }
            sw.Stop();
            Console.WriteLine(string.Format("DigitsOnly2: {0}", sw.Elapsed));
    
            sw.Restart();
            for (int i = 0; i < iterations; ++i) {
                bool success = DigitsOnly3(s1);
                bool failure = DigitsOnly3(s2);
            }
            sw.Stop();
            Console.WriteLine(string.Format("DigitsOnly3: {0}", sw.Elapsed));
    
            sw.Restart();
            for (int i = 0; i < iterations; ++i) {
                int dummy;
                bool success = int.TryParse(s1, out dummy);
                bool failure = int.TryParse(s2, out dummy);
            }
            sw.Stop();
            Console.WriteLine(string.Format("int.TryParse: {0}", sw.Elapsed));
    
            sw.Restart();
            var regex = new Regex("^[0-9]+$", RegexOptions.Compiled);
            for (int i = 0; i < iterations; ++i) {
                bool success = regex.IsMatch(s1);
                bool failure = regex.IsMatch(s2);
            }
            sw.Stop();
            Console.WriteLine(string.Format("Regex.IsMatch: {0}", sw.Elapsed));
    
        }
    
    }
    

    ...produces the following result...

    DigitsOnly: 00:00:00.0346094
    DigitsOnly2: 00:00:00.0365220
    DigitsOnly3: 00:00:00.2669425
    int.TryParse: 00:00:00.3405548
    Regex.IsMatch: 00:00:00.7017648
    

提交回复
热议问题