从小数值末尾删除0

我有一个十进制值,后面有一个可变的位数. , 例如:

 0.0030 0.0310 0.0001 1.1200 

如何编写一个在小数结尾处删除0的动态函数?

 string.Format("{0:0.#####}", 0.0030) 

要么

 var money=1.3000m; money.ToString("0.#####"); 

为了将来参考,我推荐John Sheehan撰写的.NET格式字符串快速参考 。

你也可以修改小数本身,这样任何ToString()都会给你你想要的东西(我在这里回答的更多细节):

 public static decimal Normalize(decimal value) { return value/1.000000000000000000000000000000000m; } 
 decimal value = 0.0030m; value.ToString(“G29″); 

编辑:G格式化程序确实有效,唯一的问题是,如果原始小数中有太多有效数字,它会跳转到科学记数法。 不太理想。

请参阅此处的“常规(”G“)格式说明符”文档: http : //msdn.microsoft.com/en-us/library/dwhawy9k.aspx#GFormatString

我正在吃午饭,所以我做了一点测试:

 decimal d1 = 0.000100m; decimal d2 = 0.001000000000000000000000m; decimal d3 = 0.000000000000001000000000m; Console.WriteLine(Environment.NewLine + "input decimal: 0.000100m"); Console.WriteLine("G " + d1.ToString("G")); Console.WriteLine("G29 " + d1.ToString("G29")); Console.WriteLine("0.####### " + d1.ToString("0.#######")); Console.WriteLine(Environment.NewLine + "input decimal: 0.001000000000000000000000m"); Console.WriteLine("G " + d2.ToString("G")); Console.WriteLine("G29 " + d2.ToString("G29")); Console.WriteLine("0.####### " + d2.ToString("0.#######")); Console.WriteLine(Environment.NewLine + "input decimal: 0.000000000000001000000000m"); Console.WriteLine("G " + d3.ToString("G")); Console.WriteLine("G29 " + d3.ToString("G29")); Console.WriteLine("0.####### " + d3.ToString("0.#######")); 

输出:

 input decimal: 0.000100m G 0.000100 G29 0.0001 0.####### 0.0001 input decimal: 0.001000000000000000000000m G 0.001000000000000000000000 G29 0.001 0.####### 0.001 input decimal: 0.000000000000001000000000m G 0.000000000000001000000000 G29 1E-15 0.####### 0 

嗯,这是一个显示格式问题(将小数转换为字符串时会添加零)。

您需要查看代码中您看到尾随零的位置。 是在调用.ToString()之后吗? 尝试使用不同的格式字符串:

 .ToString("#"); .ToString("0.00"); .ToString("#.##"); 

等等。 最好的方法就是尝试不同的可能值。

 decimal m = 0.030000m; Console.Write(m.ToString("0.##########")); 

只需确保您有足够的#s表示要显示的小数位数

我使用以下内容。 它确保任何小数(最大精度为29位小数)将显示所有可用的精度数字,而不会尾随零,并且您的代码不需要长丑陋的哈希标记字符串。

 if (value is Decimal) value = ((Decimal)value).ToString("0.".PadRight(29, '#'), culture); 
  public static string GentlyRemoveEndZeros(string input) { // if (input == null) return null; // if (input == "") return ""; if (input.Contains(".")) return input.TrimEnd('0').TrimEnd('.'); return input; } 

截断尾随零非常容易,使用双工转换解析:

  decimal mydecimal = decimal.Parse("1,45000000"); //(I) decimal truncate = (decimal)(double)mydecimal; //(II) 

(I) – >从任何字符串源中解析十进制值。

(II) – >首先:强制转换为双尾,删除尾随零。 第二:其他强制转换为十进制,因为不存在从十进制到双精度的隐式转换,反之亦然)