zoukankan      html  css  js  c++  java
  • c#你怎么判断一个字符串是否是数字?(转)

    今天在写代码时突然想起测试经常用Microsoft.VisualBasic.Information.IsNumeric判断 url参数是否为数字时的这个方法的效率
    因为数字是字符串是直接使用的,所以不需要转型,也就没有用tryparse
    结果一测试吓一跳,这个方法的效率是如此的低,再测试了下tryparse还不错,正则的也比较差,
    没什么技术含量,看结果吧:

    先拓展下字符串:

    code
       public static class Common
        {
           
    //isDigit
            public static bool isNumberic1(this string _string)
            {
               
    if (string.IsNullOrEmpty(_string))
                   
    return false;
               
    foreach (char c in _string)
                {
                   
    if (!char.IsDigit(c))//if(c<'0' || c>'9')//最好的方法,在下面测试数据中再加一个0,然后这种方法效率会搞10毫秒左右
                       
    return false;
                }
               
    return true;
            }

           
    //vb isnumberic
            public static bool isNumberic2(this string _string)
            {
               
    return !string.IsNullOrEmpty(_string) && Microsoft.VisualBasic.Information.IsNumeric(_string);
            }
           
    //try parse
            public static bool isNumberic3(this string _string)
            {
               
    if (string.IsNullOrEmpty(_string))
                   
    return false;
               
    int i = 0;
               
    return int.TryParse(_string, out i);
            }

           
    //try catch
            public static bool isNumberic4(this string _string)
            {
               
    if (string.IsNullOrEmpty(_string))
                   
    return false;
               
    try { int.Parse(_string); }
               
    catch { return false; }
               
    return true;
            }
           
    //regex
            public static bool isNumberic5(this string _string)
            {
               
    return !string.IsNullOrEmpty(_string) && Regex.IsMatch(_string, "^\\d+$");
            }
        }

    测试的代码:

    code
    class Program
        {
           
    static void Main(string[] args)
            {

                Test(
    "1234");
                Test(
    "1234a");
                Test(
    "a1234");
                Test(
    "");
                Test(
    null);
               
            }

           
    static void Test(string str)
            {
               
    bool res1 = false, res2 = false, res3 = false, res4 = false, res5 = false;
                Stopwatch wat
    = new Stopwatch();
                wat.Start();
    //
                for (int i = 1; i < 100000; i++)
                {
                    res1
    = str.isNumberic1();
                }
                wat.Stop();
                Console.WriteLine(
    "isDigit      {0}:{1},{2}", str, wat.ElapsedMilliseconds, res1);

                wat.Reset();
                wat.Start();
               
    for (int i = 1; i < 100000; i++)
                {
                    res2
    = str.isNumberic2();
                }
                wat.Stop();
                Console.WriteLine(
    "isNumberic   {0}:{1},{2}", str, wat.ElapsedMilliseconds, res2);

                wat.Reset();
                wat.Start();
               
    for (int i = 1; i < 100000; i++)
                {
                    res3
    = str.isNumberic3();
                }
                wat.Stop();
                Console.WriteLine(
    "try parse    {0}:{1},{2}", str, wat.ElapsedMilliseconds, res3);

                wat.Reset();
                wat.Start();
               
    for (int i = 1; i < 100000; i++)
                {
                    res4
    = str.isNumberic4();
                }
                wat.Stop();
                Console.WriteLine(
    "try catch    {0}:{1},{2}", str, wat.ElapsedMilliseconds, res4);

                wat.Reset();
                wat.Start();
               
    for (int i = 1; i < 100000; i++)
                {
                    res5
    = str.isNumberic5();
                }
                wat.Stop();
                Console.WriteLine(
    "regex        {0}:{1},{2}", str, wat.ElapsedMilliseconds, res5);
                Console.WriteLine();
            }
        }

    下面是我本机的测试结果

    isDigit      1234:5,True
    isNumberic   1234:166,True
    try parse    1234:21,True
    try catch    1234:22,True
    regex        1234:134,True

    isDigit      1234a:5,False
    isNumberic   1234a:196,False
    try parse    1234a:19,False
    try catch    1234a:5182,False
    regex        1234a:150,False

    isDigit      a1234:2,False
    isNumberic   a1234:184,False
    try parse    a1234:16,False
    try catch    a1234:5084,False
    regex        a1234:106,False

    isDigit      :1,False
    isNumberic   :0,False
    try parse    :0,False
    try catch    :1,False
    regex        :0,False

    isDigit      :1,False
    isNumberic   :0,False
    try parse    :1,False
    try catch    :1,False
    regex        :0,False

    结果:循环判断是否是数字字符效率是最高的
    而VisualBasic的方法效率比较低了
    顺便测试了下VisualBasic里的left和right方法效率也一样的低,还不及substring的十分之一
    所以VisualBasic里虽然有几个方法从名字看来比较好用,实际却比较杯具。
  • 相关阅读:
    C++调试帮助
    C++中的前置(后置)++与--
    C++11 使用using定义类型别名
    C++11 尾置返回类型
    [BUUCTF]PWN——pwnable_hacknote
    [BUUCTF]PWN——ciscn_2019_es_7[详解]
    [BUUCTF]PWN——mrctf2020_easyoverflow
    [BUUCTF]PWN——wustctf2020_closed
    [BUUCTF]PWN——0ctf_2017_babyheap
    [BUUCTF]PWN——ciscn_2019_s_4
  • 原文地址:https://www.cnblogs.com/timy/p/2290138.html
Copyright © 2011-2022 走看看