如何测试 null 的小数?

How can I test a decimal for null?

我有这段代码旨在将 null 十进制值转换为 "zero" 值:

decimal paymentTot = TryConvertToDecimal(boxPaymentAmount.Text);
if ((null == paymentTot) || (paymentTot < 0))
{
    paymentTot = 0M; // or simply 0?
}

private decimal TryConvertToDecimal(String incoming)
{
    decimal result = 0.0M;
    try
    {
        result = Convert.ToDecimal(incoming);
    }
    catch
    {
        ; // nada
    }
    return result;
}

编译成功,但我收到警告:"The result of the expression is always 'false' since a value of type 'decimal' is never equal to 'null' of type 'decimal?'"

我不理解它试图告诉我的内容。我需要什么样的测试来安抚警告发射器,更重要的是,确保我的代码可以等同于 'true' 当这是意图时?

decimal 是值类型,不能为空。

如果你想有一个可为空的小数,那么使用 Nullable<decimal>decimal?,它是 decimal 类型的包装器,(它仍然是一个值类型虽然)

参见:Nullable<T> Structure

您也可以将您的方法解析为:

private Nullable<decimal> TryConvertToDecimal(String incoming)
{
    Nullable<decimal> returnValue = null;
    decimal result;
    if (decimal.TryParse(incoming, out result))
    {
        returnValue = result;
    }
    return returnValue;
}

另外如果你要忽略解析中的异常,最好使用decimal.TryParse

您可能希望从 TryConvertToDecimal return 一个 Nullable<decimal> (shorthand decimal?),因为 decimal 是不可为 null 的值类型。

private decimal? TryConvertToDecimal(String incoming)
{
    try
    {
        return Convert.ToDecimal(incoming);
    }
    catch
    {
       return null;
    }
}

var paymentTot = TryConvertToDecimal(boxPaymentAmount.Text);
if (!paymentTot.HasValue || paymentTot.Value < 0)
{
    paymentTot = 0;
}

但是请注意,按照惯例 TryXXX 函数 return bool 并在成功时使用 out 参数 return 解析值。框架内置的其中之一是 decimal.TryParse,您可能想改用它:

decimal paymentTot;
if(!decimal.TryParse(boxPaymentAmount.Text, out paymentTot) || paymentTot < 0)
    paymentTot = 0;
如果解析失败,

将默认为 0 如果解析的值 < 0,如您的问题中所指定。我建议这很可能是您正在寻找的解决方案。

您不需要自己的转换器,而是使用它:

decimal paymentTot;
if(!decimal.TryParse(boxPaymentAmount.Text, out paymentTot))
    paymentTot = 0;