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?
2 Answers 2
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.
-
\$\begingroup\$ oh yeah - forgot about that method (-: \$\endgroup\$cs0815– cs08152015年12月21日 13:14:20 +00:00Commented Dec 21, 2015 at 13:14
-
\$\begingroup\$ 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 :) \$\endgroup\$Morgen– Morgen2015年12月21日 16:52:10 +00:00Commented Dec 21, 2015 at 16:52
-
\$\begingroup\$ @Morgen I have mixed feelings about the out parameter, it feels so low level... \$\endgroup\$Caridorc– Caridorc2015年12月21日 18:38:40 +00:00Commented Dec 21, 2015 at 18:38
-
2\$\begingroup\$ @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. \$\endgroup\$Morgen– Morgen2015年12月21日 18:45:54 +00:00Commented Dec 21, 2015 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;
}