如何测试小数是否为空?



我已经得到了这段代码,用于将空十进制值转换为"零"值:

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' ?"

我不明白它到底想告诉我什么。我需要什么样的测试来安抚警告发射器,更重要的是,确保我的代码在意图为"真"时等同于"真"?

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

你不需要自己的转换器,使用这个代替:

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

您可能希望从TryConvertToDecimal返回一个Nullable(简称decimal?),因为decimal是一个不可空的值类型。

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参数返回解析后的值。框架中内置的其中一个功能是十进制。您可能想要使用的TryParse:
decimal paymentTot;
if(!decimal.TryParse(boxPaymentAmount.Text, out paymentTot) || paymentTot < 0)
    paymentTot = 0;
如果解析失败

将默认为0;如果解析值为<0,正如你的问题所述。我认为这可能是你正在寻找的解决方案。

最新更新