java中的双数字格式

时间:2015-04-13 20:16:36

标签: java string formatting

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

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

问题是我需要这个号码:

  • 如果超过15位,则显示为科学记数法
  • 如果小于15位,则显示它而不进行舍入。

另外,我不希望在小数点之前或之后有任何固定的位数。

有什么建议吗?

这是我的号码显示的代码snipet:

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

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

2 个答案:

答案 0 :(得分:0)

只需使用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));
}

答案 1 :(得分:0)

这似乎与您要求的接近:

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);

但是,如果你正试图阻止对齐"事情变得复杂,因为分数的数量取决于指数中的位数。