【问题标题】:Cannot format nullable decimal using ToString("#.##")无法使用 ToString("#.##") 格式化可为空的小数
【发布时间】:2018-01-13 00:47:30
【问题描述】:

如何格式化可为空的小数,使其字符串输出格式化为两位小数?

Salary = g.Where(x => !String.IsNullOrEmpty(x.Salary))
.Select(x => (decimal?)decimal.Parse(x.Salary))
.DefaultIfEmpty(null)
.Sum().ToString();

上述方法有效,但有时会产生非常长的小数结果

203827.82763651324038269

我想将结果格式化为两位小数

203827.83

由于我想要的输出是一个字符串,我认为我可以使用

.Sum().ToString("#.##);

但我收到错误 No overload for method 'ToString' takes 1 arguments,我认为这是因为结果是 nullable decimal。我该如何解决这个问题?

【问题讨论】:

    标签: linq format decimal


    【解决方案1】:

    你是对的,Nullable(T).ToString() 不接受任何参数。相反,您可以使用老式的 string.Format 或字符串插值简写:

    var result = g.Where(x => !String.IsNullOrEmpty(x.Salary))
        .Select(x => (decimal?)decimal.Parse(x.Salary))
        .DefaultIfEmpty(null)
        .Sum();
    
    Salary = $"{result:#.###}";
    

    但是,不清楚您为什么要在这里投射到decimal?,为什么不简单地这样:

    Salary = g.Where(x => !String.IsNullOrEmpty(x.Salary))
        .Select(x => decimal.Parse(x.Salary))
        .Sum()
        ToString("#.###");
    

    当然,我建议将 x.Salary 的值保留为 decimal 而不是 string,但这是另一回事。

    【讨论】:

    • 我认为使用.DefaultIfEmpty(null) 是最好的,因为该值可能为空。
    • 所以不需要.DefaultIfEmpty(null)吧?
    • 正确,或转换为可为空的小数。
    • 可能是一个完全不同的问题,但是当我删除 .DefaultIfEmpty(null)(decimal?) 时,我有时会收到 sequence contains no elements 错误。我有这些,以防它来自 XML 中的垃圾(例如字母)
    • 哦...好吧,如果您不总是有行,请尝试使用.DefaultIfEmpty(0) 而不是null。这样你的总价值就会为零。
    【解决方案2】:

    是的,你是对的。可空小数的 ToString 不接受任何参数并且没有重载。您需要访问可为空的小数的值:

    var Salary = g.Where(x => !String.IsNullOrEmpty(x.Salary))
    .Select(x => (decimal?)decimal.Parse(x.Salary))
    .DefaultIfEmpty(null)
    .Sum();
    var result=Salary.HasValue?Salary.Value.ToString("#:##"):"";
    

    【讨论】:

    • 我害怕那个。 LINQ 语句是Select( new { ...}).ToList() 的一部分。不知道如何拉出这部分。
    猜你喜欢
    • 2010-12-22
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 2016-06-24
    相关资源
    最近更新 更多