Introduction

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 String class.

bool b      = "true".ConvertTo<bool>();
DateTime d1 = " 01:23:45 ".ConvertTo<DateTime>();
Point p     = "100,25".ConvertTo<Point>();

//convert, but use specific culture. 
//in this case the comma is used as a decimal seperator
Double d    = "1.234,567".ConvertTo<double>("NL")

//provide a default value, if conversion fails
Guid g      = "i'm not a guid".ConvertTo<Guid>(Guid.Empty);

Background

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 to good to be true. But as always I soon came back to earth when "it" wasn't too impressed with my localized numbers eg. -1.234,56. Anyway, I've managed to resolve this in what seems like a nice clean extensions method that integrates into the String class.

Using the code

All the hard work is done by TypeConverters which according to the MSDN documentation provide a unified way of converting types of values to other types, as well as for accessing standard values and subproperties. I was particulary interested in the convertion 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 add two sets of overloads, one which basically allows 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 Exception.

//this will through an exception
//because the text can not be converted to the specified type

int x = "abcd".ConvertTo<int>();

//even this one will fail due to the localization that is set 
//to dutch where comma's are used as decimal separators

int y = "1,234.56".ConvertTo<int>("NL");

The other set of methods allow you to specify a default value which will be used if the TypeConverter fails in which case the Exception will be suppressed.

//use default value if TypeConverter will fail

DateTime a = "i'm not a date".ConvertTo<DateTime>(DateTime.Today);

//or with localization support
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 nor 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.

Download StringExtensions.ConvertTo.zip - 1.28 KB