2

在 Java 中,我试图让 DecimalFormat 强制指数符号上的符号。当它是积极的我需要一个加号出现。从我所读到的内容来看,这似乎很简单,但对我自己来说,它总是会引发错误。我很欣赏可能有其他方法可以实现我的目标,但我想了解为什么在这种特定方法中会发生错误。

Double result = 123.456;
String sresult;

//This works
NumberFormat formatter = new DecimalFormat("0.00000E00");
        sresult = formatter.format(result); 
        System.out.println(sresult);        //1.23456E02

//This doesn't work
formatter = new DecimalFormat("0.00000E+00"); //Want to enforce the sign to appear
        sresult = formatter.format(result); 
        System.out.println(sresult);        //Expected 1.23456E+02 but error occurs

抛出的错误:

线程“主”java.lang.IllegalArgumentException 中的异常:
畸形指数模式“0.00000E+00”
    在 java.text.DecimalFormat.applyPattern(未知来源)
    在 java.text.DecimalFormat.(未知来源)
    在 deccheck.main(deccheck.java:13)

我很欣赏任何见解。谢谢,马克

4

4 回答 4

4

我想通过j flemm扩展解决方案。“E”和“-”不是常数,它们可以设置为DecimalFormatSymbols。因此,替换必须尊重这一点:

public static String hoola(final String s, final DecimalFormatSymbols symbols) {
    String result;
    final String expo = symbols.getExponentSeparator();
    final char minus = symbols.getMinusSign();
    if (!s.contains(expo + minus)) { // don't blast a negative sign
    result = s.replace(expo, expo + '+');
    } else {result=s;}
    return result;
}

/**
 * @param args
 */
public static void main(final String[] args) {
    final DecimalFormat decForm = (DecimalFormat) NumberFormat
            .getInstance(Locale.GERMAN);
    final DecimalFormatSymbols newSymbols = new DecimalFormatSymbols(
            Locale.GERMAN);
    newSymbols.setExponentSeparator("*10^");
    newSymbols.setMinusSign('\u2212');
    decForm.setDecimalFormatSymbols(newSymbols);
    decForm.applyPattern("0.00000E00");
    System.out.println(hoola(decForm.format(1234.567), decForm
            .getDecimalFormatSymbols()));
    System.out.println(hoola(decForm.format(000.00567), decForm
            .getDecimalFormatSymbols()));
}

结果是:

  • 1,23457*10^+03
  • 5,67000*10^−03
于 2010-08-06T16:00:33.297 回答
3

简单的方法:

formatter = new DecimalFormat("0.00000E00"); // Want to enforce the sign to appear
sresult = formatter.format(result);
if (!sresult.contains("E-")) { //don't blast a negative sign
    sresult = sresult.replace("E", "E+");
}
System.out.println(sresult);

您的示例的输出1.23456E+02

但我不相信有办法从DecimalFormat模式内部做到这一点。或者至少 javadoc 没有表明有一个。

编辑: trashgod 提出了一个很好的观点。DecimalFormatSymbols如果您计划将其本地化到不同的地区,您可能希望从中获得积极和消极的迹象。

编辑 2: Andrei 指出这E也是一个本地化变量。显示我对本地化的了解。

于 2010-08-06T14:57:07.563 回答
1

我不认为“+”字符是模式中可接受的字符(在学习了 javadocs 之后)。指数部分 si 的模式描述为:

 Exponent:
         E MinimumExponent
 MinimumExponent:
         0 MinimumExponent(opt)

如果你在那里添加任何东西,它会混淆解析器。我认为你唯一的选择是给它正常的模式(没有'+'),然后获取字符串并使用正则表达式在那里添加'+'。

sresult = formatter.format(result);
sresult = sresult.replaceAll("E([^\\-]+)", "E+$1");

最好的选择可能是扩展 DecimalFormat 并在覆盖格式方法中执行此操作

于 2010-08-06T15:03:46.350 回答
1

@j flemm 的方法很吸引人,因为“负指数是使用本地化的减号格式化的,而不是模式中的前缀和后缀。”—<a href="http://download-llnw.oracle.com/javase/6/ docs/api/java/text/DecimalFormat.html" rel="nofollow noreferrer"> DecimalFormat

于 2010-08-06T15:06:08.007 回答