by J. Ambrose Little
Feedback
|
Average Rating:  
Views (Total / Last 10 Days):
59652/
229
|
|
|
|
| Test Details |
For this benchmark, I compared six different methods of checking a value to see if it is numeric:
-
Regular Expression - Uses a simple regular expression (^(\d*\.?\d*)$) that matches any digits (0-9) and allows for one decimal point.
-
Try ToDouble & Catch - Couches a call to System.Convert.ToDouble inside of a try-catch statement; returns true if no error occurs, false if one does occur.
-
Try Parse & Catch - Couches a call to System.Double.Parse inside of a try-catch statement; returns true if no error occurs, false if one does occur.
-
Double.TryParse - Uses the System.Double.TryParse method to see if the input is numeric. Also returns converted value if successful.
-
VisualBasic IsNumeric - Uses a call to Microsoft.VisualBasic.Information.IsNumeric to see if the input is numeric.
-
Incremental Char - Loops through each char of the string, using System.Char.IsNumber to see if each char is numeric. Also allows for one decimal point by comparing each char to '.'. Thanks to Dave Wanta for suggesting this method.
The test system is a Dell Inspiron 8500 with a Pentium 4-M 2.2GHz CPU, 1GB DDR PC2100 RAM, and 40GB 5400RPM IDE HD. The application was built and runs on version 1.1 of the .NET Framework, optimized and without debugging information (default Release configuration in VS.NET). The test involves calling each method 100,000 times using the given input, clocking the start and end time, and extracting the elapsed time in seconds. I ran two tests for each method, one using input of a valid decimal number (Figure 1) and one using an input of an invalid string containing both numerals and letters (Figure 2). Please feel free to download the source and run benchmarks on your own machines.
|
|
|
|
|
Article Feedback
User Comments
Title:
Straight to the point
Name:
Fabio C. Rispoli
Date:
8/1/2006 4:16:33 PM
Comment:
Congratulations for the article. Simple and straight to the point.
Thanks.
|
Title:
Mr.
Name:
mike
Date:
4/5/2006 10:30:42 AM
Comment:
double.TryParse is also slower than Incremental Chars.
|
Title:
Gopal
Name:
Ambrose
Date:
3/22/2006 1:19:05 PM
Comment:
Gopal,
It's been a long time that I looked at this, but I seem to recall that the VB code didn't use double.TryParse. Maybe it was updated? Are you looking at v2 because this was written before v2 was in alpha...
|
Title:
Another note
Name:
gopal
Date:
3/22/2006 1:13:08 PM
Comment:
Incremental char returns true for empty strings. Also, looking at the disassembly code, Visualbasic Isnumeric uses Double.TryParse.
|
Title:
just a note
Name:
E
Date:
2/16/2006 3:37:19 PM
Comment:
I was just noticing that the Incremental Char method returns false for negative numbers. . .
|
Title:
IsNumeric?
Name:
Peter Hartlén
Date:
11/17/2005 3:31:17 AM
Comment:
First of all, I did the test with converting a string to integer. Although the code needed for this was a bit more than I at first expected, the performance overhead (compared to simple TryParse) was not that much. The code I used:
public bool TryParseToInt ( string expression, out int iIntVal ) { double dVal; bool bRes;
bRes = double.TryParse(expression, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out dVal); if( dVal > Int32.MaxValue || dVal < Int32.MinValue ) { iIntVal = 0; bRes = false; } else iIntVal = Convert.ToInt32(dVal);
return bRes; }
As you can see, this method both tests if the string is a valid integer (Int32), and if so, converts the value using the out parameter.
Regarding your results (compared to mine):
Are you sure the data for VB's IsNumeric is correct? During my tests it shows the same performance as try-catch blocks. I’ve read that IsNumeric uses try/catch itself, so it’s merely a wrapper.
The execution time for the Regular Expression method increases quite dramatically when I increase the length of the input string and the faulty character is at the end.
Also worth mention, I did a test with 1 million strings where 2% where faulty (i.e. non-numbers). The performance between a try-catch block function and a TryParse-based function was negligible. So in the real life (where you won’t find 100% correct nor 100% erroneous data), the result looks quite different!
|
Title:
Have to be careful
Name:
Steve Maier
Date:
11/16/2005 11:38:30 AM
Comment:
One thing to remember tho with the incremental character approach is localization. some places use ',' for the decimal point and '.' for the grouping character. With the Parse and TryParse methods, they can take the culture value and will parse things correctly.
|
Title:
Nice reading!
Name:
Peter Hartlén
Date:
11/16/2005 10:16:27 AM
Comment:
Thanks, this was exactly what I was looking for!
I'm using Compact Framework and for example Int32.TryParse is not available, it would be interesting to see the performance of Double.TryParse (using NumberFormat.Integer), with a cast to Int32. I will try this using your code!
Thanks again!
|
Title:
Thanks for the article !
Name:
Deon
Date:
11/2/2005 8:43:18 AM
Comment:
Great article.
Thanks for the effort
|
Title:
Ms.
Name:
Ututu
Date:
8/9/2005 12:32:04 PM
Comment:
Very good article, thanks a lot.
|
Title:
Try-Catch
Name:
J. Ambrose Little
Date:
7/20/2005 8:13:44 AM
Comment:
Try-catch statements are integral to a good program, but they should only be used where they need to be used. There are some good topics on Exception Management in the MSDN Library that you should review to better understand.
|
Title:
Mr.
Name:
Ram Kinkar Pandey
Date:
7/20/2005 5:24:46 AM
Comment:
I was just Looking why using try..catch in ASP.NET is bad idea. This article makes this very clear to me. Thank you
|
Title:
Mr.
Name:
Linanga Keeba
Date:
7/18/2005 2:23:36 PM
Comment:
The article assisted me very much. Thanks.
|
|
Product Spotlight
|
|
|