如何测试null的小数?

时间:2015-07-09 16:18:36

标签: c# .net null decimal

我有这个代码用于将空小数值转换为“零”值:

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;
}

它编译,但我得到这个警告:“表达式的结果总是'false',因为'decimal'类型的值永远不等于'decimal'类型的'null'。”

我不想告诉我什么。我需要进行什么样的测试来安抚警告发射器,更重要的是,当它是意图时,我认为我的代码可以等同于'true'?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

您可能希望从decimal?返回Nullable<decimal>(简写TryConvertToDecimal),因为十进制是一种不可为空的值类型。

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函数返回bool并使用out参数在成功时返回已解析的值。其中一个内置于框架中的是decimal.TryParse,您可能希望使用它:

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

,则

将默认为0 0,如您的问题中所述。我建议这很可能是你正在寻找的解决方案。

答案 2 :(得分:2)

您不需要自己的转换器,请改用它:

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