Every programmer has them lying around, you know what I'm talking about, those little utility functions that help with string conversions. Especially in website development, where everything is treated as plain text, I can't go without some easy functions to help me with the parsing of DateTimes, Booleans, Integers, and GUIDs, amongst others.
When I recently came across an article about TypeConverters, I immediately saw this opportunity to come up with a single Extension Method (with some overloads) that plugs right into the
bool b = "true".ConvertTo<bool>();
DateTime d1 = " 01:23:45 ".ConvertTo<DateTime>();
Point p = "100,25".ConvertTo<Point>();
Double d = "1.234,567".ConvertTo<double>("NL")
Guid g = "i'm not a guid".ConvertTo<Guid>(Guid.Empty);
Although the Microsoft .NET Framework has plenty of conversion methods, for some reason, I always had difficulty when it came to 'proper' string handling. Localized date times that weren't understood, numbers that could only be parsed if I removed the separators, etc., and yet more methods to work with Enumerator values.
When I started experimenting with the
TypeConverter, it seemed just too good to be true. But as always, I soon came back to earth when "it" wasn't too impressed with my localized numbers, e.g., -1.234,56. Anyway, I've managed to resolve this in what seems like a nice clean Extension Method that integrates into the
Using the code
All the hard work is done by
TypeConverters, which according to the MSDN documentation, provides a unified way of converting types of values to other types, as well as for accessing standard values and subproperties. I was particularly interested in the conversion from string to its strong typed counterpart, which can easily be achieved as explained by Scott.
TypeConverter converter = TypeDescriptor.GetConverter(typeof(double))
converter.ConvertFromString(null, null, text);
All that was left to do was wrapping this inside a generic function and adding two sets of overloads, which basically allow you to interpret the string and convert it to its defined type. But, if the format of the
String can not be understood by the
TypeConverter, it will raise an
int x = "abcd".ConvertTo<int>();
int y = "1,234.56".ConvertTo<int>("NL");
The other set of methods allows you to specify a default value which will be used if the
TypeConverter fails, in which case the
Exception will be suppressed.
DateTime a = "i'm not a date".ConvertTo<DateTime>(DateTime.Today);
Double b = "1a".ConvertTo<Double>(CultureInfo.InstalledUICulture, -1);
Do take a look at the ugly part which resolves the "Numbers issue", by by-passing the
BaseNumberConverter. It's not elegant or pretty, but it is contained and does the job. You might even want to swap out other
TypeConverters, for example, the
BooleanConverter in order to be able to handle strings like Yes, No, On, Off, etc.
- 04-Dec-2010: Updated the source with suggestions from Geswan and Andy. Also, handles unsigned and other exotic numeric types that were missing in the first code base. Last but not least, I've added a custom routine to handle Boolean strings like: Yes, No, On, Off, 1, and 0.