在編程的時候,經常遇到要判斷一個字符串中的字符是否全部是數字(0-9),本來是一個很容易實現的功能,但程序員首先會想到的是,這樣簡單的功能有沒有現成的函數可以用呢?VB.Net中有個IsNumeric(object),C#中只有判斷單個字符的Char.IsNumber(),IsNumeric可以判斷double類型的數字字符串,但無法排除正負號和小數點,如果判斷字符串是否是一個數的話用它挺合適,但不能用來判斷字符串是否全部由數字組成的。沒現成的方法了,只好自己寫函數:
public static bool IsNum(String str)
{
for(int i=0;i<str.Length;i++)
{
if(!Char.IsNumber(str,i))
return false;
}
return true;
}
或用正則表達式:"^\d+$"
還可以用Int32.Parse()拋出的Exception來判斷:
try
{
Int32.Parse(toBeTested);
}
catch
{
//發生了異常,那麼就不是數字了。
}
那麼哪一種方法最好呢?各有優劣。我順手寫了一個程序對每一種方法所需要的時間進行了測試。測試程序Main()內容如下:
Regex isNumeric = new Regex(@"^\d+$");
int times = 10000000;
int start, end;
int i;
string toBeTested = "6741s";
#region Test user function
start = System.Environment.TickCount;
for(i=0; i<times; i++)
{
TimingTest.IsNum(toBeTested);
}
end = System.Environment.TickCount;
Console.WriteLine("User function Time: " + (end-start)/1000.0 + " Seconds");
#endregion
#region Test Regular Expression
start = System.Environment.TickCount;
for(i=0; i<times; i++)
{
isNumeric.IsMatch(toBeTested);
}
end = System.Environment.TickCount;
Console.WriteLine("Regular Expression Time: " + (end-start)/1000.0 + " Seconds");
#endregion
#region Test Exception
start = System.Environment.TickCount;
for(i=0; i<times/100; i++)
{
try
{
Int32.Parse(toBeTested);
}
catch
{
//發生了異常,那麼就不是數字了。
}
}
end = System.Environment.TickCount;
Console.WriteLine("Exception Time: " + (end-start)/10.0 + " Seconds");
#endregion
#region Test VB.Net IsNumeric()
start = System.Environment.TickCount;
for(i=0; i<times/10; i++)
{
Microsoft.VisualBasic.Information.IsNumeric(toBeTested);
}
end = System.Environment.TickCount;
Console.WriteLine("VB.Net IsNumeric() Time: " + (end-start)/100.0 + " Seconds");
#endregion