2015-03-03 17 views
1

我觉得有点愚蠢问这个...我需要格式化一个数字以显示千位分隔符,小数点,以及显示所有有效数字所需的精确度。 我有一个有效的解决方案,但觉得必须有一个更好的办法:C#数字格式打印所有重要的数字和分隔符

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

我GOOGLE了,从开始两个网络上实现年底,找不到的答案,我的问题。 SO上的答案如remove trailing zerosC# String.format a number with dynamic number of significant digits不尊重千位分隔符要求。这两个msdn文章Standard Numeric Format StringsCustom Numeric Format Strings已经被我阅读和重读,没有带来突破。

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

一个理智和熟练的开发人员将使用什么格式的字符串?

+0

是否有帮助:http://samples.pdmlab.com/stringformatting? – Jens 2015-03-03 14:20:29

+0

@JensHorstmann - 这在英语中可能更有用(因为这里的大多数访问者和这个网站都是英文的) – Jamiec 2015-03-03 14:24:10

+0

@Jamiec同意了。没有认识到它是德语:| – Jens 2015-03-03 14:25:45

回答

1

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

最近的标准格式字符串可能是沿着N50线,但是这将显示出零达到指定的长度,所以你的例子显示为

1,234.56789000000000000000000000000000000000000000000000 
+0

同意这个解决方案。十进制是一个比字符串值的外观更大的问题。通过我在调试这两个解决方案显示只有11位数后点,但N20解决方案显示零后第11位... – Jens 2015-03-03 14:45:21

+0

@JensHorstmann这是因为双只能举行精度为15-16位十进制数字,小数点左边的4位数字只剩下11位。 – 2015-03-03 15:42:57

0

的原因还没有找到答案你想从谷歌搜索是因为你的问题有问题。

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

你可以这么像@Jamiec建议 - 它可能是你想要的东西(虽然N50是过度杀伤,你只能得到大约17个最大有效数字将二进制转换为双精度)。但是,你应该知道这并不是真正写出有效数字。基本上,您不能将计算机计算出的所有有效数字都写成十进制数,因为它是用二进制计算的。计算机在写出之前必须将其转换为十进制数字,这必然会导致精度损失。