Java 只有负指数的 DecimalFormat
Java DecimalFormat with only negative exponents
我无法定义具有以下属性的 DecimalFormat
实例(在 Java1.8 中):
- 科学计数法(指数)仅在指数为负时使用。
- 最多显示4个有效位,即最后没有0。
(如果需要,我可以不满足第二个属性。)
目的是将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 方法,或者如果确实要重写该方法。
我无法定义具有以下属性的 DecimalFormat
实例(在 Java1.8 中):
- 科学计数法(指数)仅在指数为负时使用。
- 最多显示4个有效位,即最后没有0。
(如果需要,我可以不满足第二个属性。)
目的是将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 方法,或者如果确实要重写该方法。