将DBNULL值解析为double

我使用以下行将datarow值转换为double。

 double.parse(Convert.ToString(datarow)); 

如果datarowDBNULL ,我会收到以下exception:

‘double.Parse(Convert.ToString(data))’引发了‘System.FormatException’类型的exception

如何在不使用tryparse.情况下处理这个tryparse.

另一种方法是检查datarow是否为DBNull

 double d = datarow is DBNull ? 0 : double.Parse(Convert.ToString(datarow)); 

这样,您无需检查DBNull.Value

DBNull无法DBNull或解析为double (或intdecimal等),因此在尝试解析之前必须检查datarow是否为DBNull 。 它应该是使用三元运算符的oneliner:

 doubleValue = datarow == DBNull.Value ? 0.0 : double.Parse(Convert.ToString(datarow)); 

对于这种情况,我有一堆转换实用程序方法,格式与此类似。

 // tries to convert a general object to double, if a defaultValue is provided, it will silently fall back to it, if not, it will throw exceptions public static double ToDouble(object obj, double? defaultValue = null) { if (obj == null || obj == "" || obj == DBNull.Value) return 0.0; try { if (obj is string) return double.Parse((string)obj); return Convert.ToDouble(obj); } catch { if (defaultValue != null) return defaultValue.Value; throw; } } 

我使用这种弱到强类型的转换实用程序,主要是在我使用ADO.NET的东西或其他弱类型的接口时,比如从Excel读取数据。

在我的真实代码中,我还允许传递CultureInfo进行字符串转换,并执行其他一些操作,例如规范化小数符号等,以实现最佳格式容差。

当然可以通过捕获特定的exception类型(如FormatException来改进general catch子句,但是对于我的需求它可以很好地工作。