2010-01-21 173 views
15

我有具有.后的可变数目的数字的十进制值的末尾删除0,例如:从十进制值

0.0030 
0.0310 
0.0001 
1.1200 

如何可以写一个动态函数的是,在除去0小数点的结尾?

回答

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

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

以供将来参考我由约翰·希恩建议.NET Format String Quick Reference

+2

是的,但如果你可能有6位小数或7?你最终会出现一个投机性的丑陋的#字符。 – 2010-01-21 13:47:31

+2

这会将数字舍入到最接近的万分之一。这可能或不可能是OP想要的。 – 2010-01-21 13:57:33

+3

@ andrew-m是#是一个数字占位符。在大多数情况下,你知道想要的精度是多少。如果你不想并且想要绝对确定你可以使用你当前使用的数据类型的全部精度。 “小数”可以保存28-29个有效数字。 Hacky解决方案:'.ToString(“0。”。PadRight(29,'#'))' – 2010-01-21 14:47:51

3

嗯,这是一个显示格式问题(将十进制转换为字符串时添加了零)。

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

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

依此类推。做到这一点的最好方法就是试验不同的可能值。

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

只要确保你有你想要显示

9
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 
0

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

if (value is Decimal) 
    value = ((Decimal)value).ToString("0.".PadRight(29, '#'), culture); 
25

您还可以修改小数点本身,以便任何的ToString()会给你你想要的东西 (在我的答案here更多细节):

public static decimal Normalize(decimal value) 
{ 
    return value/1.000000000000000000000000000000000m; 
} 
+8

此答案拥有,因为与此基本上所有其他答案(甚至整个主题)不同,实际上都是WORKS,并且执行OP要求的内容。可耻地看到所有这些高级代表用户急于在没有阅读/理解问题的情况下回答问题,并从一些甚至不工作的东西中得到所有的赞扬。 – Coxy 2011-12-13 01:34:02

-1
public static string GentlyRemoveEndZeros(string input) 
     { 
      // if (input == null) return null; 
      // if (input == "") return ""; 
      if (input.Contains(".")) return input.TrimEnd('0').TrimEnd('.'); 
      return input; 
     } 
+1

其他不使用“。”的语言环境如何? – 2014-07-11 09:09:05

+0

@MartinMulder同样的方法:if(input.Contains(“,”))return input.TrimEnd('0')。TrimEnd(','); – VovaM 2016-10-27 04:38:35

+1

@VovaN:的确如此,但是您的答案不能跨文化证明? – 2016-11-03 09:01:08

-2

截断尾随零是非常容易,用双工铸造解决:

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

(I) - >分析十进制值来自任何字符串源。

(二) - >第一:抛出加倍这删除尾随零。第二:其他投到小数,因为不存在从十进制隐式转换为双和反之亦然a)

+0

您将假设所有的值都适合小数点,可以放入双倍数。这可能会导致OverflowException。你也可能会失去精确性。 – 2014-07-11 09:10:23

+0

你认为是错误的,你的评论没有增加任何讨论。很明显,这里所有的都假设该值可以适用于双精度值和十进制值。这里,溢出不是问题。 Regards !! – amedriveroperez 2014-07-11 17:14:01

+0

还有谁假设?我搜索了'双'......没有其他人假设这一点。 – 2014-07-12 10:13:00