如何格式化C#小数点以除去多余的下面的0?

我想格式化一个string作为十进制,但十进制包含一些小数点后面的零。 我如何格式化这些无意义的0消失?

string.Format("{0}", 1100M); string.Format("{0}", 1100.1M); string.Format("{0}", 1100.100M); string.Format("{0}", 1100.1000M); 

显示:

 1100 1100.1 1100.100 1100.1000 

但我希望它是:

 1100 1100.1 1100.1 1100.1 

作为参考,这里是其他问题,基本上是重复的,我发现感谢这里给出的答案:

  • 分析小数点并在右边过滤额外的0?
  • 最好的方法来显示小数点后面的零
  • 我如何去掉十进制string中的零和小数点?

您可以使用ToString()General(“G”)格式说明符来获得所需的结果。 以指定的精度使用此格式string时,尾随零将被截断。 为了防止任何情况下的四舍五入,您需要将精度设置为小数(29)所允许的最大值。

生成你想要的代码是number.ToString("G29") ,其中number是你原来的小数。

请注意,任何小于0.0001的数字都将被转换为科学记数法。 有关这个格式化程序如何工作的更多细节可以在上面的参考链接中find。

 string s = d.ToString("0.#############################"); 

它们不一定是毫无意义的 – 它们表示计算过程中的精确度。 小数保持其精确度,而不是被标准化。

我在这个答案中有一些代码将返回一个规范化的值 – 你可以使用它,然后格式化结果。 例如:

 using System; using System.Numerics; class Test { static void Display(decimal d) { d = d.Normalize(); // Using extension method from other post Console.WriteLine(d); } static void Main(string[] args) { Display(123.4567890000m); // Prints 123.456789 Display(123.100m); // Prints 123.1 Display(123.000m); // Prints 123 Display(123.4567891234m); // Prints 123.4567891234 } } 

怀疑大多数格式string方法将失败。 我会猜测一个格式string“0”。 然后28#字符可以工作,但这将是非常丑陋的…

您可以像这样指定格式string :

 String.Format("{0:0.000}", x); 

怎么样:

 string FormatDecimal(decimal d) { const char point = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator[0]; string s = d.ToString(); // if there's no decimal point, there's nothing to trim if (!s.Contains(point) == -1) return s; // trim any trailing 0s, followed by the decimal point if necessary return s.TrimEnd('0').TrimEnd(point); } 

不像每个人都build议使用G格式说明符,我会build议以下内容保留千位分隔符和小数点,同时删除多余的尾随零:

 {0:#,#.##} 

在大多数情况下,这种格式的结果比G好得多:

 String.Format("{0:#,#.##}",25/2.4); 10.42 String.Format("{0:#,#.##}",1000000); 1,000,000 String.Format("{0:#,#.##}",1000000.3600000); 1,000,000.36 

G说明符不能真正处理所有可能的组合:

 String.Format("{0:G29}",25/2.4); 10.416666666666668 String.Format("{0:G2}",25/2.4); 10 String.Format("{0:G29}",1000000.3600000); 1000000.36 String.Format("{0:G2}",1000000.3600000); 1E+06 

已经有不less答案了。 我经常参考这个备忘单: http : //blog.stevex.net/string-formatting-in-csharp/

我相信你想做的事情是:

 var s = String.Format("{0:#####.###}"); 

有点hackish,但这应该工作:

 decimal a = 100.00M; string strNumber = string.Format("{0}", a); Console.WriteLine(strNumber.Contains('.') ? strNumber.TrimEnd('0').TrimEnd('.') : strNumber); 
 String.Format("{0:0.##}", 123.0); // "123" 
 double a = 1100.00 double b =1100.1 double c = 1100.100 double d =1100.1000 Remove last zero after point string stra = a.toString("0.00").TrimEnd('0').TrimEnd('.'); string strb = b.toString("0.00").TrimEnd('0').TrimEnd('.'); string strc = c.toString("0.00").TrimEnd('0').TrimEnd('.'); string strd = d.toString("0.00").TrimEnd('0').TrimEnd('.'); Output 1100 1100.1 1100.1 1100.1