将 DBNULL 值解析为 double

Parsing a DBNULL value into double

我使用以下行将 datarow 值转换为双精度值。

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

如果 datarowDBNULL,我得到以下异常:

'double.Parse(Convert.ToString(data))' threw an exception of type 'System.FormatException'

如何在不使用 tryparse.

的情况下处理这个问题

DBNull 无法转换或解析为 double(或 intdecimal 等),因此您必须检查 datarow 在尝试解析之前是 DBNull。它应该是一个使用三元运算符的单行代码:

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 进行字符串转换,并做一些其他的事情,如规范化小数符号等,以实现最佳的格式容错性。

一般的 catch 子句当然可以通过捕获特定的异常类型来改进,比如 FormatException,但对于我的需要来说它工作得很好。

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

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

这样,您就不需要检查 DBNull.Value