删除尾随零
我有一些由一个集合返回的字段
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', '.');
然后将其转换为浮动