My application reads an Excel file using VSTO and adds the read data to a StringDictionary
. It adds only data that are numbers with a few digits (1000 1000,2 1000,34 - comma is a delimiter in Russian standards).
What is better to check if the current string is an appropriate number?
object data, string key; // data had read
try
{
Convert.ToDouble(regionData, CultureInfo.CurrentCulture);
dic.Add(key, regionData.ToString());
}
catch (InvalidCastException)
{
// is not a number
}
or
double d;
string str = data.ToString();
if (Double.TryParse(str, out d)) // if done, then is a number
{
dic.Add(key, str);
}
I have to use StringDictionary
instead of Dictionary<string, double>
because of the following parsing algorithm issues.
My questions: Which way is faster? Which is safer?
And is it better to call Convert.ToDouble(object)
or Convert.ToDouble(string)
?
I did a quick non-scientific test in Release mode. I used two inputs: "2.34523" and "badinput" into both methods and iterated 1,000,000 times.
Valid input:
Not much different, as expected. For all intents and purposes, for valid input, these are the same.
Invalid input:
Well.. it was running for a long time. I reran the entire thing using 1,000 iterations and
Convert.ToDouble
with bad input took 8.3 seconds. Averaging it out, it would take over 2 hours. I don't care how basic the test is, in the invalid input case,Convert.ToDouble
's exception raising will ruin your performance.So, here's another vote for
TryParse
with some numbers to back it up.To start with, I'd use
double.Parse
rather thanConvert.ToDouble
in the first place.As to whether you should use
Parse
orTryParse
: can you proceed if there's bad input data, or is that a really exceptional condition? If it's exceptional, useParse
and let it blow up if the input is bad. If it's expected and can be cleanly handled, useTryParse
.Unless you are 100% certain of your inputs, which is rarely the case, you should use Double.TryParse.
The speed of the parse becomes secondary when you throw an exception because there is not much slower than an exception.
Personally, I find the
TryParse
method easier to read, which one you'll actually want to use depends on your use-case: if errors can be handled locally you are expecting errors and a bool fromTryParse
is good, else you might want to just let the exceptions fly.I would expect the
TryParse
to be faster too, since it avoids the overhead of exception handling. But use a benchmark tool, like Jon Skeet's MiniBench to compare the various possibilities.I have always preferred using the
TryParse()
methods because it is going to spit back success or failure to convert without having to worry about exceptions.I generally try to avoid the
Convert
class (meaning: I don't use it) because I find it very confusing: the code gives too few hints on what exactly happens here sinceConvert
allows a lot of semantically very different conversions to occur with the same code. This makes it hard to control for the programmer what exactly is happening.My advice, therefore, is never to use this class. It's not really necessary either (except for binary formatting of a number, because the normal
ToString
method of number classes doesn't offer an appropriate method to do this).