怎么用Double?在.NET中使用Math.Round的可空类型

时间:2011-02-27 08:37:03

标签: c# .net

我想做这样的事情,但C#不接受这个:

    public static void setPrice(Double? value)
    {

        if (value != null) {
            this.TextBoxPrice.Text = Math.Round(value, 2).ToString();
        } else {
            this.TextBoxPrice.Text = "No Price";   
        }

    }

这是否意味着使用可空类型Double?在这个用例中是完全没用的?那我可以用什么呢?

更新:我做了一个mystypo我的意思是

    public static void setPrice(Double? value)

所以我纠正了。

3 个答案:

答案 0 :(得分:16)

您目前没有使用可空类型 - Double是不可为空的值类型,因此永远不能为空。这就是你想要的:

public static void setPrice(Double? value)
{

    if (value != null) {
        this.TextBoxPrice.Text = Math.Round(value.Value, 2).ToString();
    } else {
        this.TextBoxPrice.Text = "No Price";   
    }
}

另一方面,您使用double来表示财务价值。它不适合作为二进制浮点类型。请改用decimal(或decimal?)。

(请注意,Double?相当于Nullable<Double>。)

如果您来自Java背景,那么您可能期望Double成为引用“包装”类型 - 但事实并非如此。在C#中double只是System.Double的别名;他们是同一类型。

答案 1 :(得分:13)

Jon的答案很好 - 特别注意关于十进制的一点 - 但我想我会补充一点,你可以使用高阶编程将“提升”方法变为可空。例如:

public static Func<T?, T?> Lift<T>(Func<T, T> func) where T : struct
{
    return (T? t)=>t.HasValue ? (T?)func(t.Value) : (T?)null;
}

public static Func<A?, R> LiftRef<A, R>(Func<A, R> func) where A : struct where R : class
{
    return (A? a)=>a.HasValue ? func(a.Value) : null;
}

现在你可以说:

Func<decimal, decimal> round2 = x=>Math.Round(x, 2);
Func<decimal?, decimal?> liftedRound2 = Lift(round2);
Func<decimal?, string> liftedToString = LiftRef(decimal.ToString);
...

public static void SetPrice(decimal? value)
{
    this.TextBoxPrice.Text == liftedToString(liftedRound2(value)) ?? "No Price";
} 

答案 2 :(得分:1)

我同意Jon Skeet的回答,并且只是想在这个特定情况下添加,你可以考虑简单地添加一个ClearPrice方法 - 出于更清晰的API +避免if-else的原因。