当显示当前使用.ToString()的十进制值时,它精确到15位小数,因为我使用它来表示美元和美分,所以我只希望输出为2位小数。

我是否为此使用.ToString()的变体?


当前回答

Decimal有一个非常重要的特点,这一点并不明显:

十进制“知道”它有多少个小数点,这取决于它来自哪里

以下可能是意外的:

Decimal.Parse("25").ToString()          =>   "25"
Decimal.Parse("25.").ToString()         =>   "25"
Decimal.Parse("25.0").ToString()        =>   "25.0"
Decimal.Parse("25.0000").ToString()     =>   "25.0000"

25m.ToString()                          =>   "25"
25.000m.ToString()                      =>   "25.000"

对Double执行相同的操作将导致上述所有示例的小数位数为零(“25”)。

如果你想要小数点到小数点后2位,那么可能性很高,这是因为它是货币,在这种情况下,95%的时间都可以:

Decimal.Parse("25.0").ToString("c")     =>   "$25.00"

或者在XAML中使用{Binding Price,StringFormat=c}

我遇到过一个需要十进制作为十进制的例子,那就是将XML发送到Amazon的Web服务时。服务正在抱怨,因为Decimal值(最初来自SQL Server)被发送为25.1200并被拒绝(25.12是预期格式)。

我所需要做的就是十进制。无论值的来源如何,用2个小数位舍入(…)来解决问题。

 // generated code by XSD.exe
 StandardPrice = new OverrideCurrencyAmount()
 {
       TypedValue = Decimal.Round(product.StandardPrice, 2),
       currency = "USD"
 }

TypedValue是Decimal类型,所以我不能只做ToString(“N2”),需要将其舍入并保持为十进制。

其他回答

给定小数d=12.345;表达式d.ToString(“C”)或String.Format(“{0:C}”,d)产生$12.35-请注意,使用了当前区域性的货币设置,包括符号。

请注意,“C”使用当前区域性中的位数。您可以始终使用C{precision说明符}(如String.Format(“{0:C2}”,5.123d))重写默认值以强制执行必要的精度。

decimalVar.ToString("F");

这将:

舍入到小数点后2位,例如23.456→ 23.46确保总是2位小数,例如23→ 23.00; 12.5→ 12.50

非常适合显示货币。

查看ToString(“F”)的文档(感谢Jon Schneider)。

如果您只需要保留2位小数(即切掉所有剩余的小数):

decimal val = 3.14789m;
decimal result = Math.Floor(val * 100) / 100; // result = 3.14

如果只需要保留3位小数:

decimal val = 3.14789m;
decimal result = Math.Floor(val * 1000) / 1000; // result = 3.147

https://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx

此链接详细说明了如何处理问题,以及如果您想了解更多信息,可以做什么。为了简单起见,您想做的是

double whateverYouWantToChange = whateverYouWantToChange.ToString("F2");

如果你想要一种货币,你可以通过键入“C2”而不是“F2”来简化

下面是一个Linqpad小程序,可以显示不同的格式:

void Main()
{
    FormatDecimal(2345.94742M);
    FormatDecimal(43M);
    FormatDecimal(0M);
    FormatDecimal(0.007M);
}

public void FormatDecimal(decimal val)
{
    Console.WriteLine("ToString: {0}", val);
    Console.WriteLine("c: {0:c}", val);
    Console.WriteLine("0.00: {0:0.00}", val);
    Console.WriteLine("0.##: {0:0.##}", val);
    Console.WriteLine("===================");
}

以下是结果:

ToString: 2345.94742
c: $2,345.95
0.00: 2345.95
0.##: 2345.95
===================
ToString: 43
c: $43.00
0.00: 43.00
0.##: 43
===================
ToString: 0
c: $0.00
0.00: 0.00
0.##: 0
===================
ToString: 0.007
c: $0.01
0.00: 0.01
0.##: 0.01
===================