Java DecimalFormat只有负指数

时间:2018-04-05 14:23:30

标签: java formatting decimalformat

我无法使用以下属性定义DecimalFormat实例(在Java1.8中):

  • 仅当指数为负数时才使用科学记数法(指数)。
  • 最多显示4个重要位置,即最后没有0。

(如果有必要,我可以在没有满足第二个财产的情况下生活。)

目的是将双精度转换为字符串,即使用format方法。以下是一些示例所需的行为:

Representation of 9: 9
Representation of 9.0: 9
Representation of 9876.6: 9877
Representation of 0.0098766: 9.877E-3
Representation of 0.0000000098766: 9.877E-9

如果我定义DecimalFormat df = new DecimalFormat("#.###E0");,则会给出

Representation of 9: 9E0
Representation of 9.0: 9E0
Representation of 9876.6: 9.877E3
Representation of 0.0098766: 9.877E-3
Representation of 0.0000000098766: 9.877E-9

前三种情况是错误的。不允许DecimalFormat("#.###E#")DecimalFormat("#.###E")之类的内容(IllegalArgumentException被抛出)。

产生输出的代码如下所示。

DecimalFormat df = new DecimalFormat("#.###E0");
double[] xs = new double[] {9, 9.0, 9876.6, 0.0098766, 0.0000000098766};
String[] xsStr = new String[] {"9", "9.0", "9876.6", "0.0098766", "0.0000000098766"};
for(int i = 0; i < xs.length; i++) {
    System.out.println("Representation of " + xsStr[i] + ": " + df.format(xs[i]));
}

2 个答案:

答案 0 :(得分:2)

您可以尝试使用if语句检查数字是否低于1.

if (xs < 1) {
    System.out.println("Representation of " + xsStr[i] + ": " + df.format(xs[i]));
}
else {
    System.out.println("Representation of " + xsStr[i] + ": " + xs[i];
}

另一种选择是使用三元运算符。

System.out.println("Representation of " + xsStr[i] + ": " + xs[i] < 1 ? df.format(xs[i]) : xs[i]);

这个答案很好地解释了它的工作原理。 https://stackoverflow.com/a/25164343/

答案 1 :(得分:0)

我认为你不能使用普通的DecimalFormatter课来达到目标​​。如果所有内容都使用相同的DecimalFormatter实例,那么您可以继承DecimalFormatter,然后在覆盖的format方法中应用类似tristan的答案。

如果这样做,请确保解析方法不在任何地方使用,或者如果确保也要覆盖它。