判断一个字符串是否全是数字的多种方法及其性能比较(C#实现)

在编程的时候,经常遇到要判断一个字符串中的字符是否全部是数字(0-9),本来是一个很容易实现的功能,但程序员首先会想到的是,这样简单的功能有没有现成的函数可以用呢?VB.NET中有个IsNumeric(object),C#中只有判断单个字符的Char.IsNumber(),IsNumeric可以判断double类型的数字字符串,但无法排除正负号和小数点,如果判断字符串是否是一个数的话用它挺合适,但不能用来判断字符串是否全部由数字组成的。没现成的方法了,只好自己写函数:

public static bool IsNum(String str)
{
for(int i=0;i

 1<str.length;i++) "="" #endregion="" #region="" (end-start)="" **20.33="" **303="" **建议仅把exception作为处理异常的一种手段,而不是作为控制流程的一种手段。**="" +="" 1="" 1**="" 1.922="" 1.938="" 1.953="" 1.964="" 10.0="" 100.0="" 1000.0="" 100;="" 100,这样不太严谨,但是数量级不会错的。="" 10;="" 11.921="" 11.979="" 12="" 12.016="" 12.60="" 14.82**="" 2.000="" 3.1="" 39.07="" 39.69="" 4.05="" 40="" 40.162="" 40.797="" 49.7="" 590.6="" 595.3="" 600="" 9.64="" :="" ;="" ;结果就成了:="" bool="" byte="" catch="" console.writeline("exception="" console.writeline("regular="" console.writeline("user="" console.writeline("vb.net="" decimal),无法作进一步的要求(是否有小数点等)。但isnumeric的参数是object,不局限于string。="" double="" end="System.Environment.TickCount;" end;="" exception="" expression="" false;="" for(i="0;" for(int="" function="" i="0;i&lt;str.Length;i++)" i++)="" i;="" i<times="" i<times;="" if(!char.isnumber(str,i))="" if(str[i]<="0" int="" int16="" int32="" int32.parse(tobetested);="" int64="" isnum(string="" isnumeric="new" isnumeric()="" isnumeric.ismatch(tobetested);="" isnumeric是现成的函数,用起来最省事,只能判断所给的参数是否是数值(boolean="" microsoft.visualbasic.information.isnumeric(tobetested);="" public="" regex="" regex(@"^\d+$");="" regular="" return="" seconds="" seconds");="" single="" start="System.Environment.TickCount;" start,="" static="" str)="" str[i]="" string="" test="" time:="" times="10000000;" timingtest.isnum(tobetested);="" tobetested="67412" true;="" try="" user="" vb.net="" {="" ||="" }="" 三次运行的结果是:="" 使用异常是应该避免的。="" 写到这里,我不禁想,还有没有比自定义函数更快的方法呢?答案是肯定的。在前面的自定义函数中,用的是char.isnumber()函数,这个函数不仅能判断标准ascii码中的'1',甚至对全角中文的'1'的判断也是true,可见char.isnumber()判断的是所有的unicode字符中的数字,其他语言中的数字也包括了。假如我们只允许ascii中的'1'的话,我们可以这样改:="" 发生了异常,那么就不是数字了。="" 因为exception所用的时间太长,所以只测试了1="" 平均时间:="" 或用正则表达式:"^\d+$"="" 正则表达式法和isnumeric速度在同一个数量级上,但正则表达式可以确定一种字符串的格式,比如规定一定要有或没有小数点等,而isnumeric无法做到。="" 测试也表明,当有异常抛出时,要消耗大量的资源。="" 结果很明显,自定义函数速度最快,异常的速度最慢。假如不需要抛异常的话string="" 结论:="" 自定义函数可以获得最大的灵活性和最高的性能,而且复杂性也不高,是最佳的方法。="" 还可以用int32.parse()抛出的exception来判断:="" 速度之比依次约为:="" 那么哪一种方法最好呢?各有优劣。我顺手写了一个程序对每一种方法所需要的时间进行了测试。测试程序main()内容如下:="">='9')   
 2return false;   
 3}   
 4return true;   
 5}   
 6  
 7测试结果也令我吃惊,这样比原来的IsNum速度提高了近 **10** 倍,平均执行时间是  **0.205** 秒! 
 8
 9结果全部出来了,该怎样选择大家心里肯定已经有数了,我也不需要再说什么了。   
10  
11祝大家新年愉快!</str.length;i++)>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus