最好的方法来显示小数点后面的零

有没有一个显示格式化程序,将输出小数作为这些string表示在C#中没有做任何舍入?

// decimal -> string 20 -> 20 20.00 -> 20 20.5 -> 20.5 20.5000 -> 20.5 20.125 -> 20.125 20.12500 -> 20.125 0.000 -> 0 

{0#}将四舍五入,并且使用一些Trimtypes函数将不能在网格中使用绑定的数字列。

你是否有最大数量的小数位,你将永远需要显示? (你的例子最多5个)。

如果是这样,我会认为用“0。#####”格式化会做你想要的。

  static void Main(string[] args) { var dList = new decimal[] { 20, 20.00m, 20.5m, 20.5000m, 20.125m, 20.12500m, 0.000m }; foreach (var d in dList) Console.WriteLine(d.ToString("0.#####")); } 

我刚刚学会了如何正确使用G格式说明符。 请参阅MSDN文档 。 有一个说明一点点说明,当没有指定精度时,尾随零将保留为十进制types。 为什么他们会这样做,我不知道,但指定我们的精度的最大数字位数应该解决这个问题。 所以格式化小数, G29是最好的select。

 decimal test = 20.5000m; test.ToString("G"); // outputs 20.5000 like the documentation says it should test.ToString("G29"); // outputs 20.5 which is exactly what we want 

这个string格式应该让你的一天:“0。#############################”。 请记住,小数尽pipe可以有至多29个有效数字。

例子:

 ? (1000000.00000000000050000000000m).ToString("0.#############################") -> 1000000.0000000000005 ? (1000000.00000000000050000000001m).ToString("0.#############################") -> 1000000.0000000000005 ? (1000000.0000000000005000000001m).ToString("0.#############################") -> 1000000.0000000000005000000001 ? (9223372036854775807.0000000001m).ToString("0.#############################") -> 9223372036854775807 ? (9223372036854775807.000000001m).ToString("0.#############################") -> 9223372036854775807.000000001 

这是我上面看到的又一个变化。 在我的情况下,我需要保留小数点右侧的所有有效数字,意味着在最重要的数字后面全部为零。 只是认为这将是很好的分享。 虽然我不能保证这个效率,但是当试图达到美观时,你已经非常无能为力了。

 public static string ToTrimmedString(this decimal target) { string strValue = target.ToString(); //Get the stock string //If there is a decimal point present if (strValue.Contains(".")) { //Remove all trailing zeros strValue = strValue.TrimEnd('0'); //If all we are left with is a decimal point if (strValue.EndsWith(".")) //then remove it strValue = strValue.TrimEnd('.'); } return strValue; } 

就这些,只想扔我的两分钱。

扩展方法:

 public static class Extensions { public static string TrimDouble(this string temp) { var value = temp.IndexOf('.') == -1 ? temp : temp.TrimEnd('.', '0'); return value == string.Empty ? "0" : value; } } 

示例代码:

 double[] dvalues = {20, 20.00, 20.5, 20.5000, 20.125, 20.125000, 0.000}; foreach (var value in dvalues) Console.WriteLine(string.Format("{0} --> {1}", value, value.ToString().TrimDouble())); Console.WriteLine("=================="); string[] svalues = {"20", "20.00", "20.5", "20.5000", "20.125", "20.125000", "0.000"}; foreach (var value in svalues) Console.WriteLine(string.Format("{0} --> {1}", value, value.TrimDouble())); 

输出:

 20 --> 20 20 --> 20 20,5 --> 20,5 20,5 --> 20,5 20,125 --> 20,125 20,125 --> 20,125 0 --> 0 ================== 20 --> 20 20.00 --> 2 20.5 --> 20.5 20.5000 --> 20.5 20.125 --> 20.125 20.125000 --> 20.125 0.000 --> 0 

开箱即用很容易:

 Decimal YourValue; //just as example String YourString = YourValue.ToString().TrimEnd('0','.'); 

这将从您的十进制中删除所有的尾随零。

你唯一需要做的就是添加.ToString().TrimEnd('0','.'); 转换为十进制variables,将十进制转换为不带尾随零的string,如上例所示。

在一些地区它应该是一个.ToString().TrimEnd('0',','); (在这里我们用逗号代替点,但是你也可以添加一个点和一个逗号作为参数)

(你也可以添加两个参数)

另一种解决scheme,基于诵读困难的答案,但独立于当前的文化:

 public static string ToTrimmedString(this decimal num) { string str = num.ToString(); string decimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator; if (str.Contains(decimalSeparator)) { str = str.TrimEnd('0'); if(str.EndsWith(decimalSeparator)) { str = str.RemoveFromEnd(1); } } return str; } public static string RemoveFromEnd(this string str, int characterCount) { return str.Remove(str.Length - characterCount, characterCount); } 

我不认为这是可能的,但这样一个简单的方法应该这样做

 public static string TrimDecimal(decimal value) { string result = value.ToString(System.Globalization.CultureInfo.InvariantCulture); if (result.IndexOf('.') == -1) return result; return result.TrimEnd('0', '.'); } 
 decimal val = 0.000000000100m; string result = val == 0 ? "0" : val.ToString().TrimEnd('0').TrimEnd('.'); 

我结束了以下代码:

  public static string DropTrailingZeros(string test) { if (test.Contains(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator)) { test = test.TrimEnd('0'); } if (test.EndsWith(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator)) { test = test.Substring(0, test.Length - CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator.Length); } return test; }