Java 只有负指数的 DecimalFormat

Java DecimalFormat with only negative exponents

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

(如果需要,我可以不满足第二个属性。)

目的是将double转换为字符串,即使用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]));
}

您可以尝试使用 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]);

这个答案很好地解释了它是如何工作的。

我不认为你可以使用正常的 DecimalFormatter class 来实现你的目标。如果所有内容都使用相同的 DecimalFormatter 实例,那么您可以使用 subclass DecimalFormatter 然后在覆盖的 format 方法中应用类似特里斯坦的答案。

如果执行此操作,请确保没有在任何地方使用 parse 方法,或者如果确实要重写该方法。