Answers:
decimalVar.ToString ("#.##"); // returns "" when decimalVar == 0
要么
decimalVar.ToString ("0.##"); // returns "0" when decimalVar == 0
Decimal
和Double
type ToString
方法接受用于格式化的参数。首先尝试将您的值转换为十进制/双精度。
我知道这是一个古老的问题,但是我很惊讶地看到没有人发布这个答案。
这就是我要使用的:
decimal.Round(yourValue, 2, MidpointRounding.AwayFromZero);
decimalVar.ToString("F");
这将:
23.456
→23.46
23
→ 23.00
; 12.5
→12.50
显示货币的理想选择。
查看有关ToString(“ F”)的文档(感谢Jon Schneider)。
.
可以,
根据区域性替换为。您应该将其CultureInfo.InvariantCulture
作为第二个参数来禁用它。
如果只需要显示此字符,则使用string.Format
String.Format("{0:0.00}", 123.4567m); // "123.46"
http://www.csharp-examples.net/string-format-double/
“ m”是十进制后缀。关于十进制后缀:
给定十进制d = 12.345; 表达式d.ToString(“ C”)或String.Format(“ {0:C}”,d)得出$ 12.35注意,使用了当前区域性的货币设置(包括符号)。
请注意,“ C”使用当前区域性的位数。您可以随时覆盖默认强制必要的精度与C{Precision specifier}
喜欢String.Format("{0:C2}", 5.123d)
。
如果要使用逗号和小数点(但没有货币符号)格式化,例如3,456,789.12 ...
decimalVar.ToString("n2");
已经有两个涉及Decimal.Round(...)的高分答案,但是我认为还需要更多解释-因为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"
为上述每个)。
如果您希望将小数点后两位保留到小数点后两位,则有95%的可能性,这是因为它是货币,在这种情况下,这种情况在95%的时间中可能会很好:
Decimal.Parse("25.0").ToString("c") => "$25.00"
或者在XAML中,您只需使用 {Binding Price, StringFormat=c}
我遇到一种情况,当我将XML发送到Amazon的Web服务时,我需要一个十进制的AS。该服务正在抱怨,因为正以十进制值(最初是从SQL Server)发送25.1200
并被拒绝(25.12
是期望的格式)。
我需要做的只是Decimal.Round(...)
用小数点后两位来解决问题。
// This is an XML message - with generated code by XSD.exe
StandardPrice = new OverrideCurrencyAmount()
{
TypedValue = Decimal.Round(product.StandardPrice, 2),
currency = "USD"
}
TypedValue
是类型的,Decimal
所以我不能只做ToString("N2")
而需要对其进行舍入并将其保留为decimal
。
这是一个小的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
===================
Mike M.的答案对.NET非常适合我,但decimal.Round
在撰写本文时,.NET Core没有任何方法。
在.NET Core中,我必须使用:
decimal roundedValue = Math.Round(rawNumber, 2, MidpointRounding.AwayFromZero);
一种hacky方法,包括转换为字符串,是:
public string FormatTo2Dp(decimal myNumber)
{
// Use schoolboy rounding, not bankers.
myNumber = Math.Round(myNumber, 2, MidpointRounding.AwayFromZero);
return string.Format("{0:0.00}", myNumber);
}
评分最高的答案描述了一种格式化十进制值的字符串表示形式的方法,该方法有效。
但是,如果您实际上想将保存的精度更改为实际值,则需要编写如下内容:
public static class PrecisionHelper
{
public static decimal TwoDecimalPlaces(this decimal value)
{
// These first lines eliminate all digits past two places.
var timesHundred = (int) (value * 100);
var removeZeroes = timesHundred / 100m;
// In this implementation, I don't want to alter the underlying
// value. As such, if it needs greater precision to stay unaltered,
// I return it.
if (removeZeroes != value)
return value;
// Addition and subtraction can reliably change precision.
// For two decimal values A and B, (A + B) will have at least as
// many digits past the decimal point as A or B.
return removeZeroes + 0.01m - 0.01m;
}
}
单元测试示例:
[Test]
public void PrecisionExampleUnitTest()
{
decimal a = 500m;
decimal b = 99.99m;
decimal c = 123.4m;
decimal d = 10101.1000000m;
decimal e = 908.7650m
Assert.That(a.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("500.00"));
Assert.That(b.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("99.99"));
Assert.That(c.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("123.40"));
Assert.That(d.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("10101.10"));
// In this particular implementation, values that can't be expressed in
// two decimal places are unaltered, so this remains as-is.
Assert.That(e.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("908.7650"));
}
您可以使用system.globalization将数字格式化为任何所需格式。
例如:
system.globalization.cultureinfo ci = new system.globalization.cultureinfo("en-ca");
如果您有a decimal d = 1.2300000
且需要将其修剪到2个小数位,则可以像这样打印它d.Tostring("F2",ci);
,其中F2是将字符串格式格式化为2个小数位,而ci是语言环境或cultureinfo。
有关更多信息,请检查此链接
http://msdn.microsoft.com/zh-cn/library/dwhawy9k.aspx
https://msdn.microsoft.com/zh-CN/library/dwhawy9k%28v=vs.110%29.aspx
该链接详细说明了您如何处理问题以及如何了解更多信息。为了简单起见,您要做的是
double whateverYouWantToChange = whateverYouWantToChange.ToString("F2");
如果您希望以此作为一种货币,则可以通过键入“ C2”而不是“ F2”来简化操作
如果只需要保留小数点后两位(即,舍去所有其余的十进制数字):
decimal val = 3.14789m;
decimal result = Math.Floor(val * 100) / 100; // result = 3.14
如果只需要保留小数点后三位:
decimal val = 3.14789m;
decimal result = Math.Floor(val * 1000) / 1000; // result = 3.147