如何在C#中格式化 decimal
,以使小数点后至少有一位数字,但如果指定小数点后多于1位数字,则没有固定的上限:
5 -> "5.0"
5.1 -> "5.1"
5.122 -> "5.122"
10.235544545 -> "10.235544545"
使用ToString("0.0###########################")
。
一些注意事项:
#
,因为decimal
结构可以容纳高达28位小数的精度。0
自定义格式说明符将导致始终显示数字,即使值为0。#
自定义格式说明符仅在该数字为零且该数字右/左侧(取决于您所处的小数点位置)的所有数字都为零时才显示值。0
后插入尽可能多的#
以适应您将传递给ToString
的所有值的长度,如果您只需要精确到10位小数,则需要九个#
(因为您已经处理了右侧的第一位小数点)有关更多信息,请参阅MSDN标题为“自定义数字格式字符串”的部分。
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var a = 5m;
var b = 5.1m;
var c = 5.122m;
var d = 10.235544545m;
var ar = DecToStr.Work(a);
var br = DecToStr.Work(b);
var cr = DecToStr.Work(c);
var dr = DecToStr.Work(d);
Assert.AreEqual(ar, "5.0");
Assert.AreEqual(br, "5.1");
Assert.AreEqual(cr, "5.122");
Assert.AreEqual(dr, "10.235544545");
}
}
public class DecToStr
{
public static string Work(decimal val)
{
if (val * 10 % 10 == 0)
return val.ToString("0.0");
else
return val.ToString();
}
}
Func<decimal, string> FormatDecimal = d => (
d.ToString().Length <= 3 ||
!d.ToString().Contains(".")) ? d.ToString("#.0") : d.ToString()
);
d=1000
这样的情况会失败吗?因为它的字符串表示长度会超过 3 个字符。 - Chris
#
更清晰的解决方案。 - StianToString
,它可以实现你想要的功能。然而,你必须传递某种虚拟变量给它,因为扩展方法不会覆盖与其具有相同签名的类型上的方法(或者另外命名)。 - casperOneToString()
。 - Anthony Pegram0
和 27 个#
来覆盖所有小数。@AnthonyPegram:没错,但我在评论中已经提到了这一点。 - casperOneFormatStrings
类,其中包含一个静态或常量的AllDecimalDigits
字符串成员,其中包含所需的格式字符串。然后,您只需要执行myDecimal.ToString(FormatStrings.AllDecimalDigits)
即可。 - LukeH