c#你怎么判断一个字符串是否是数字?(转载)

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

先拓展下字符串:

code
复制代码
   publicstaticclass Common     {         //isDigit        publicstaticbool isNumberic1(thisstring _string)         {             if (string.IsNullOrEmpty(_string))                 returnfalse;             foreach (char c in _string)             {                 if (!char.IsDigit(c))//if(c<'0' || c>'9')//最好的方法,在下面测试数据中再加一个0,然后这种方法效率会搞10毫秒左右                     returnfalse;             }             returntrue;         }
       
//vb isnumberic        publicstaticbool isNumberic2(thisstring _string)         {             return!string.IsNullOrEmpty(_string) && Microsoft.VisualBasic.Information.IsNumeric(_string);         }         //try parse        publicstaticbool isNumberic3(thisstring _string)         {             if (string.IsNullOrEmpty(_string))                 returnfalse;             int i =0;             returnint.TryParse(_string, out i);         }
       
//try catch        publicstaticbool isNumberic4(thisstring _string)         {             if (string.IsNullOrEmpty(_string))                 returnfalse;             try { int.Parse(_string); }             catch { returnfalse; }             returntrue;         }         //regex        publicstaticbool isNumberic5(thisstring _string)         {             return!string.IsNullOrEmpty(_string) && Regex.IsMatch(_string, "^\\d+$");         }     }
复制代码

 

测试的代码:

 

code
复制代码
class Program     {         staticvoid Main(string[] args)         {
            Test(
"1234");             Test("1234a");             Test("a1234");             Test("");             Test(null);                     }
       
staticvoid 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里虽然有几个方法从名字看来比较好用,实际却比较杯具。
 
posted @ 2012-06-11 08:33  我心微凉  阅读(308)  评论(0)    收藏  举报