删除尾随零

我有一些由一个集合返回的字段

2.4200 2.0044 2.0000 

我想要的结果像

 2.42 2.0044 2 

我试着用String.Format ,但它返回2.0000并将其设置为N0四舍五入其他值以及。

是不是这样简单,如果input是一个string? 你可以使用其中的一个:

 string.Format("{0:G29}", decimal.Parse("2.0044")) decimal.Parse("2.0044").ToString("G29") 2.0m.ToString("G29") 

这应该适用于所有input。

更新检查标准数字格式我不得不显式设置精度说明符为29作为文档清楚地说明:

但是,如果数字是十进制数,并且省略了精度说明符,则始终使用定点表示法,并且保留结尾的零

更新 Konrad在评论中指出 :

注意像0.000001这样的值。 G29格式将以最短的方式显示它们,所以它将切换到指数表示法。 string.Format("{0:G29}", decimal.Parse("0.00000001",System.Globalization.CultureInfo.GetCultureInfo("en-US")))将给出“1E-08”作为结果。

我遇到了同样的问题,但在一个情况下,我不能控制输出到string,这是由图书馆照顾的。 在查看Decimaltypes实现的详细信息后(请参阅http://msdn.microsoft.com/en-us/library/system.decimal.getbits.aspx ),我想出了一个简洁的技巧(这里是一个扩展方法):

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

小数点的指数部分被简化为所需要的。 在输出十进制数上调用ToString()将写入没有任何结尾0的数字

 1.200m.Normalize().ToString(); 

在我看来,它更安全的使用自定义数字格式string 。

 decimal d = 0.00000000000010000000000m; string custom = d.ToString("0.#########################"); // gives: 0,0000000000001 string general = d.ToString("G29"); // gives: 1E-13 

我使用这个代码来避免“G29”科学记数法:

 public static string DecimalToString(decimal dec) { string strdec = dec.ToString(CultureInfo.InvariantCulture); return strdec.Contains(".") ? strdec.TrimEnd('0').TrimEnd('.') : strdec; } 

我发现了一个优雅的解决schemehttp://dobrzanski.net/2009/05/14/c-decimaltostring-and-how-to-get-rid-of-trailing-zeros/

基本上

十进制v = 2.4200M;

v.ToString( “#######”); //将返回2.42。 #的数量是你支持的小数位数。

使用散列( # )符号只在必要时显示尾随0。 请参阅下面的testing。

 decimal num1 = 13.1534545765; decimal num2 = 49.100145; decimal num3 = 30.000235; num1.ToString("0.##"); //13.15% num2.ToString("0.##"); //49.1% num3.ToString("0.##"); //30% 

这正是你想要的:

如果您的初始值是decimal

 decimal source = 2.4200m; string output = ((double)source).ToString(); 

如果你的初始值是string

 string source = "2.4200"; string output = double.Parse(source).ToString(); 

并应该花费最低的性能。

取决于你的号码代表什么,以及你想如何pipe理这些值:它是一种货币,你需要四舍五入或截断,你只需要这个舍入来显示?

如果要显示考虑格式化的数字是x.ToString(“”)

http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx和;

http://msdn.microsoft.com/en-us/library/0c899ak8.aspx

如果只是四舍五入,则使用Math.Round超载,需要MidPointRounding超载

http://msdn.microsoft.com/en-us/library/ms131274.aspx

如果你从数据库中得到你的值,考虑转换而不是转换:double value =(decimal)myRecord [“columnName”];

一个非常低层次的方法,但我相信这将是最高性能的方式,只使用快速整数计算(并没有缓慢的stringparsing和文化敏感的方法):

 public static decimal Normalize(this decimal d) { int[] bits = decimal.GetBits(d); int sign = bits[3] & (1 << 31); int exp = (bits[3] >> 16) & 0x1f; uint a = (uint)bits[2]; // Top bits uint b = (uint)bits[1]; // Middle bits uint c = (uint)bits[0]; // Bottom bits while (exp > 0 && ((a % 5) * 6 + (b % 5) * 6 + c) % 10 == 0) { uint r; a = DivideBy10((uint)0, a, out r); b = DivideBy10(r, b, out r); c = DivideBy10(r, c, out r); exp--; } bits[0] = (int)c; bits[1] = (int)b; bits[2] = (int)a; bits[3] = (exp << 16) | sign; return new decimal(bits); } private static uint DivideBy10(uint highBits, uint lowBits, out uint remainder) { ulong total = highBits; total <<= 32; total = total | (ulong)lowBits; remainder = (uint)(total % 10L); return (uint)(total / 10L); } 

很简单的答案是使用TrimEnd()。 这是结果,

 double value = 1.00; string output = value.ToString().TrimEnd('0'); 

输出是1如果我的值是1.01那么我的输出将是1.01

截断尾随零非常简单,用双工演员解决:

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

(I) – >从任何string源parsing十进制值。

(二) – >第一:铸造加倍,删除尾随零。 第二:其他铸造到十进制,因为不存在隐式转换从十进制到双和反之亦然a)

试试这个代码:

 string value = "100"; value = value.Contains(".") ? value.TrimStart('0').TrimEnd('0').TrimEnd('.') : value.TrimStart('0'); 

你可以设置为:

 decimal decNumber = 23.45600000m; Console.WriteLine(decNumber.ToString("0.##")); 

或者你可以将你的double值转换为Convert.ToDouble([double vlaue]) 。 它将删除尾随零(如果有的话)。

试试这个

 string s = "2.4200"; s = s.TrimStart('0').TrimEnd('0', '.'); 

然后将其转换为浮动