How can I test a decimal for null?

I've got this code intended to convert null decimal vals to a "zero" value:

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

It compiles, but I get this warning: "The result of the expression is always 'false' since a value of type 'decimal' is never equal to 'null' of type 'decimal?'"

I don't grok just what it's trying to tell me. What sort of test do I need to appease the warning emitter and, more importantly, see to it that my code can equate to 'true' when that is the intent?

Upvotes: 0

Views: 7417

Answers (3)

Habib
Habib

Reputation: 223267

decimal is a value type and it can't be null.

If you want to have a nullable decimal then use Nullable<decimal> or decimal? which is a wrapper on decimal type, (it is still a value type though).

See: Nullable<T> Structure

You can also have your method for parsing as:

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

Also it is better to use decimal.TryParse if you are going to ignore the exception in parsing.

Upvotes: 5

Stephen Kennedy
Stephen Kennedy

Reputation: 21548

You possibly want to return a Nullable<decimal> (shorthand decimal?) from TryConvertToDecimal because decimal is a non-nullable value type.

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

Note however that by convention TryXXX functions return bool and use an out argument to return the parsed value upon success. One of these built in to the Framework is decimal.TryParse which you might want to use instead:

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

will default to 0 if the parsing fails or if the parsed value is < 0, as specified in your question. I would suggest this is most likely the solution you are looking for.

Upvotes: 2

KarmaEDV
KarmaEDV

Reputation: 1691

You don't Need your own Converter for this, use this instead:

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

Upvotes: 2

Related Questions