【问题标题】:What is the MessageFormat pattern to produce localized, full precision output for any double为任何双精度生成本地化、全精度输出的 MessageFormat 模式是什么
【发布时间】:2019-05-20 04:50:30
【问题描述】:

给出示例代码:

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

【问题讨论】:

标签: java floating-point double locale messageformat


【解决方案1】:

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

使用下面的#符号,我们只显示不为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?

看一看,如果还有什么需要的,欢迎提问!

【讨论】:

  • 你的第二个例子没有输出完整的精度。科学记数法的好点。它仍然不如 Double.toString() 根据值的大小决定是否使用科学计数法。
猜你喜欢
  • 1970-01-01
  • 2011-06-06
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多