1

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

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

我从头到尾搜索了两个互联网,但找不到我的问题的答案。SO 上的答案(例如删除尾随零C# String.format 具有动态有效位数的数字)不遵守千位分隔符要求。标准数字格式字符串自定义数字格式字符串的两篇 msdn 文章都被我反复阅读,但没有带来任何突破。

我的注意力被带到c# 如何使用无限小数位 String.Format 十进制?但不幸的是,没有答案提出更简洁的格式字符串。

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

4

2 回答 2

1

老实说,我看不出你的格式化字符串有什么大问题,只要你不要到处重复它(把它放在一个充满常量的类中,然后重用)。

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

1,234.56789000000000000000000000000000000000000000000000
于 2015-03-03T14:35:46.123 回答
-1

你没有从谷歌上找到你想要的答案的原因是你的问题有问题。

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

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

于 2015-03-03T15:15:41.487 回答