java 中的双数字格式

Double number formatting in java

我正在Java开发一个计算器程序,我需要显示一个长度不超过15位数字(包括小数点)的数字。

我尝试使用 String.format("%g", myDouble)%f 格式化此数字,但无法获得我正在寻找的结果。

问题是我需要号码:

此外,我不希望小数点前后有任何固定位数。

有什么建议吗?

这是显示我的号码的代码片段:

if (("" + myDouble).length() > 15) {
    screen.setText(String.format("%g", myDouble));
} else {
    screen.setText("" + myDouble);
}

一个问题是当执行else子句时,有时数字会显示为9.0000E7,这是不利的并且不同于看起来像String.format("%g", myDouble)的科学记数法更像是 9.000e+7.

只需使用 NumberFormat 对象。有关详细信息,请参阅 the javadoc

NumberFormat formatter = new DecimalFormat();
if (("" + myDouble).length() > 15) {
    formatter = new DecimalFormat("0.######E0");
    screen.setText(formatter.format(myDouble));
} else {
    formatter = new DecimalFormat("#");
    screen.setText(formatter.format(myDouble));
}

这似乎接近您的要求:

static String format(double n) {
    if(Double.isInfinite(n) || Double.isNaN(n))
        return Double.toString(n);
    String result = BigDecimal.valueOf(n).toPlainString();
    if(result.length() > 15)
        result = String.format("%.15e", n);
    return result;
}

由于您的要求是小数位 不是 固定的,所以我真的没有办法只使用格式化程序来做到这一点。

如果您想要科学记数法的特定位数,那么您可以使用类似 "%.15e" 的格式,其中 15 是您想要的小数位数。

或者您可能想要这样的东西:

if(result.length() > 15)
    result = new DecimalFormat("0.###############E0").format(n);

但是如果你试图 "block align" 到某个最大值,那么事情就会变得复杂,因为小数位数取决于指数中的位数。