Linq 无法使用ToString(“.”)格式化可为空的十进制数

Linq 无法使用ToString(“.”)格式化可为空的十进制数,linq,format,decimal,Linq,Format,Decimal,如何格式化一个可为空的十进制数,使其字符串输出格式化为两位小数 Salary = g.Where(x => !String.IsNullOrEmpty(x.Salary)) .Select(x => (decimal?)decimal.Parse(x.Salary)) .DefaultIfEmpty(null) .Sum().ToString(); 上述方法可行,但有时会产生很长的十进制结果 203827.82763651324038269 我想将结果格式化为小数点后两位 203

如何格式化一个可为空的十进制数,使其字符串输出格式化为两位小数

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("#.##);

但是我得到一个错误,方法“ToString”没有重载,它接受1个参数,我认为这是因为结果是一个可为空的十进制数。我如何解决这个问题?

是的,你说得对。可空十进制的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("#:##"):"";
你是对的,不接受任何争论。相反,您可以使用老式的string.Format或string interpolation速记:

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

Salary = $"{result:#.###}";
但是,不清楚为什么要强制转换为十进制?在这里,为什么不简单地说:

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

当然,我会建议将x.Salary值保留为十进制而不是字符串,但这是另一回事。

我很害怕。LINQ语句是Select new{…}.ToList的一部分。不确定如何提取此部分。我认为使用.DefaultIfEmptynull是最好的,因为该值可以为null。因此没有必要使用.DefaultIfEmptynull对吗?正确,或转换为可为null的十进制。可能是一个完全不同的问题,但当我删除.DefaultIfEmptynull和十进制时?我有时会得到一个序列包含没有错误的元素。我有这些在那里的情况下,有垃圾的XML,它来自像字母的例子哦。。。如果不总是有行,那么尝试使用.DefaultIfEmpty0而不是null。这样,你的和值将为零。