C#数字格式打印所有有效数字和分隔符

时间:2015-03-03 14:16:03

标签: c# string-formatting number-formatting format-string

我觉得有点愚蠢的问这个...我需要格式化一个数字来显示千位分隔符,十进制标记,以及显示所有有效数字所需的精确度。 我有一个有效的解决方案,但我觉得必须有更好的方法:

double myNumber = 1234.56789;
myNumber.ToString("#,##0.#########################################################################################################################"); // see my problem with this?
// will yield "1,234.56789"

我从头到尾搜索了两个互联网,但找不到问题的答案。像remove trailing zerosC# String.format a number with dynamic number of significant digits这样的答案不尊重千位分隔符要求。 Standard Numeric Format StringsCustom Numeric Format Strings的msdn文章已被我阅读并重新阅读,但没有取得突破。

我的注意力被带到了c# how to String.Format decimal with unlimited decimal places?,但遗憾的是没有一个更简洁的格式字符串的答案。

理智的开发人员使用什么格式字符串?

2 个答案:

答案 0 :(得分:1)

老实说,我没有看到你的格式化字符串的一个很大的问题,只要你不在任何地方重复它(把它放在一个充满常量的类中,并重用)。

最近的标准格式字符串可能与N50一致,但是这将显示指定长度的零,因此您的示例显示为

1,234.56789000000000000000000000000000000000000000000000

答案 1 :(得分:0)

您没有从Google搜索中找到答案的原因是因为您的问题存在问题。

双打不以十进制形式存储,它们是二进制数。所以基于小数的“有效数字”的概念并没有真正意义。例如,数字0.1不能用二进制精确表示(很像1/3不能用十进制表示法精确表示)。

你可以像@Jamiec那样建议 - 而且它可能与你想要的一样(虽然N50有点矫枉过正,你只能获得大约17个最大有效数字,将二进制转换为双精度)。但是,你应该知道并没有真正写出有效数字。从根本上说,您不能将计算机计算出的所有有效数字写成十进制数,因为它是以二进制形式计算的。计算机在写出之前必须首先将其转换为十进制,这必然会导致精度损失。