0

给定示例代码:

String format = "{0,number}"; // <- What do I put here?
double value = Math.PI * 1e-10;
System.out.println(value);
System.out.println(new MessageFormat(format, Locale.US).format(new Object[]{value}));
System.out.println(new MessageFormat(format, Locale.FRANCE).format(new Object[]{value}));

我使用什么作为格式字符串,以便获得任何双精度值的全精度输出并且输出是本地化的?例如,当前代码的输出是:

3.1415926535897934E-10
0
0

String.valueOf(double)正确打印完整的精度,但它不是消息格式,也没有本地化。消息格式决定该值太小而无法打扰。对于大量数字,结果甚至更糟!MessageFormat打印 16 个有效数字,然后附加一堆不能准确反映存储在双精度值中的零。例如,pi * 1e100我得到:

3.141592653589793E100
31,415,926,535,897,930,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000
31 415 926 535 897 930 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
4

1 回答 1

0

仅出于您的要求,这是适合您的代码的最简单的解决方案。

使用#下面的符号,我们仅在数字不为 0 时显示数字,否则将被省略。

double value = Math.PI*1e-10;
        String format = "{0,number,#.###############E0}"; // <- What do I put here?

        System.out.println(value);
        System.out.println(new MessageFormat(format, Locale.US).format(new Double[]{value}));
        System.out.println(new MessageFormat(format, Locale.FRANCE).format(new Double[]{value}));

如果您想使用科学通知省略格式数字的转换,例如,而不是 9.424777960769379E2(如果格式为 #.##############E0)或 94.24777960769379E1(如果格式为 # #.###############E0 ) 为 942.4777960769379,只需使用以下代码:

        double value = Math.PI*1e-10;
        String format = "{0,number,#.################}"; // <- What do I put here?

看一下,如果您还需要什么,请随时询问!

于 2018-12-19T19:02:55.233 回答