显示尾随零,除了整数

是否有一种方法(在.NET中)在使用.ToString("...")时从数字中删除尾随零,但如果数字不是整数,则显示为2位小数:

  1. (12345.00).ToString(…)应显示为12345
  2. (12345.10).ToString(…)应显示为12345.10
  3. (12345.12).ToString(…)应显示为12345.12

是否有1个数字格式字符串可以在所有这些场景中使用?

.ToString("#.##")几乎可以工作,但没有显示方案2的尾随0 …

此外,其他文化不是问题,我只想要小数点(不是逗号等)

沿着这些方向的东西?

  if (number % 1 == 0) Console.WriteLine(string.Format("{0:0}", number)); else Console.WriteLine(string.Format("{0:0.00}", number)); 

编辑

虽然这个代码中有一个小错误:) 1.001将打印为“1.00”…这可能不是你想要的,如果你需要打印1.001为“1”你需要更改if(。 ..)测试检查有限公差。 由于这个问题更多的是关于格式化,我将保持答案不变,但在生产代码中你可能想要考虑这种问题。

脏的方式:

 string.Format("{0:0.00}", number).Replace(".00","") 

不是一种格式,但它适合一行:

 double a = 1.0; string format = string.Format((a == (int)a) ? "{0:0}" : "{0:0.00}", a); 

我不能说我遇到了一个能做到这一点的面具。 我会用

 string output = (value % 1 > 0) ? String.Format("{0:0.00}", value) : String.Format("{0:0.##}", value); 

我猜你可以用你自己的方法来生成那个显示,因为它是否是一个整数的条件。

 public static class Extensions { public static string ToCustomString(this decimal d) { int i = (int)d; if (i == d) return i.ToString(); return d.ToString("#.00"); } } 

如果要使用它来显示货币,可以使用以下内容

 float fVal = 1234.20f; String strVal = fVal.Tostring("c"); 

您可以编写这样的扩展方法来为您进行格式化:

 public static string FormatNumberString(this double input) { int temp; string inputString = input.ToString(); return Int32.TryParse(inputString, out temp) ? inputString : input.ToString("0.00"); } 

如果您希望在ASP MVC Razor中执行此操作,那么您可以试试这个

 @string.Format(item.DecimalNumber % 1 == 0 ? "{0:0}" : "{0:0.00}", item.DecimalNumber) 

这将表现如下:

值:2.5 – >显示:2.50

值:5 – >显示:5

值:2.45 – >显示:2.45