如何格式化C#小数点以除去多余的下面的0?
我想格式化一个string作为十进制,但十进制包含一些小数点后面的零。 我如何格式化这些无意义的0消失?
string.Format("{0}", 1100M); string.Format("{0}", 1100.1M); string.Format("{0}", 1100.100M); string.Format("{0}", 1100.1000M);
显示:
1100 1100.1 1100.100 1100.1000
但我希望它是:
1100 1100.1 1100.1 1100.1
作为参考,这里是其他问题,基本上是重复的,我发现感谢这里给出的答案:
- 分析小数点并在右边过滤额外的0?
- 最好的方法来显示小数点后面的零
- 我如何去掉十进制string中的零和小数点?
您可以使用ToString()
和General(“G”)格式说明符来获得所需的结果。 以指定的精度使用此格式string时,尾随零将被截断。 为了防止任何情况下的四舍五入,您需要将精度设置为小数(29)所允许的最大值。
生成你想要的代码是number.ToString("G29")
,其中number
是你原来的小数。
请注意,任何小于0.0001的数字都将被转换为科学记数法。 有关这个格式化程序如何工作的更多细节可以在上面的参考链接中find。
string s = d.ToString("0.#############################");
它们不一定是毫无意义的 – 它们表示计算过程中的精确度。 小数保持其精确度,而不是被标准化。
我在这个答案中有一些代码将返回一个规范化的值 – 你可以使用它,然后格式化结果。 例如:
using System; using System.Numerics; class Test { static void Display(decimal d) { d = d.Normalize(); // Using extension method from other post Console.WriteLine(d); } static void Main(string[] args) { Display(123.4567890000m); // Prints 123.456789 Display(123.100m); // Prints 123.1 Display(123.000m); // Prints 123 Display(123.4567891234m); // Prints 123.4567891234 } }
我怀疑大多数格式string方法将失败。 我会猜测一个格式string“0”。 然后28#字符可以工作,但这将是非常丑陋的…
您可以像这样指定格式string :
String.Format("{0:0.000}", x);
怎么样:
string FormatDecimal(decimal d) { const char point = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator[0]; string s = d.ToString(); // if there's no decimal point, there's nothing to trim if (!s.Contains(point) == -1) return s; // trim any trailing 0s, followed by the decimal point if necessary return s.TrimEnd('0').TrimEnd(point); }
不像每个人都build议使用G
格式说明符,我会build议以下内容保留千位分隔符和小数点,同时删除多余的尾随零:
{0:#,#.##}
在大多数情况下,这种格式的结果比G好得多:
String.Format("{0:#,#.##}",25/2.4); 10.42 String.Format("{0:#,#.##}",1000000); 1,000,000 String.Format("{0:#,#.##}",1000000.3600000); 1,000,000.36
G
说明符不能真正处理所有可能的组合:
String.Format("{0:G29}",25/2.4); 10.416666666666668 String.Format("{0:G2}",25/2.4); 10 String.Format("{0:G29}",1000000.3600000); 1000000.36 String.Format("{0:G2}",1000000.3600000); 1E+06
已经有不less答案了。 我经常参考这个备忘单: http : //blog.stevex.net/string-formatting-in-csharp/
我相信你想做的事情是:
var s = String.Format("{0:#####.###}");
有点hackish,但这应该工作:
decimal a = 100.00M; string strNumber = string.Format("{0}", a); Console.WriteLine(strNumber.Contains('.') ? strNumber.TrimEnd('0').TrimEnd('.') : strNumber);
String.Format("{0:0.##}", 123.0); // "123"
double a = 1100.00 double b =1100.1 double c = 1100.100 double d =1100.1000 Remove last zero after point string stra = a.toString("0.00").TrimEnd('0').TrimEnd('.'); string strb = b.toString("0.00").TrimEnd('0').TrimEnd('.'); string strc = c.toString("0.00").TrimEnd('0').TrimEnd('.'); string strd = d.toString("0.00").TrimEnd('0').TrimEnd('.'); Output 1100 1100.1 1100.1 1100.1