# transform string to decimal

This feels wrong:

private decimal ConvertStringToDecimal(string decimalString, decimal defaultReturnValue)
{
var returnDecimal = defaultReturnValue;

try
{
returnDecimal = decimal.Parse(decimalString.Trim());
}
catch (Exception)
{
// naughty
}

return returnDecimal;
}


but I think this is the only way to transform a string from a third party system to a decimal whilst returning a default. Does anyone have any suggestions on how to improve this?

The easiest and most clean way would be to use decimal.TryParse() like so

private decimal ConvertStringToDecimal(string decimalString, decimal defaultReturnValue)
{
decimal result;
if (decimal.TryParse(decimalString.Trim(), out result))
{
return result;
}

return defaultReturnValue;
}


Using exceptions to control the returned value isn't a good way, especially if there are better methods to use.

Your indentation is off but I assume that thats a posting issue.

• oh yeah - forgot about that method (-: – cs0815 Dec 21 '15 at 13:14
• I really don't understand why they did it this way, Java also uses exceptions for flow control when converting to numeric values. It's comforting that c# has a better alternative. Hopefully Java will “borrow” this method in the next version :) – Morgen Dec 21 '15 at 16:52
• @Morgen I have mixed feelings about the out parameter, it feels so low level... – Caridorc Dec 21 '15 at 18:38
• @Caridorc I agree, still much better than throwing an exception as you don't incur the cost of building a stack trace every time the user gives you a malformed number. Returning a Maybe/Option type would be even better. – Morgen Dec 21 '15 at 18:45

You can write the equivalent shorter, using the ternary operator ?: and decimal.tryParse, like this:

private decimal ConvertStringToDecimal(string decimalString, decimal defaultReturnValue)
{
decimal value = decimal.TryParse(decimalString, out value) ? value : defaultReturnValue;
return value;
}