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 は、1 つがあることを示していません。

編集: trashgodは良い点をもたらします. DecimalFormatSymbolsこれを別の地域にローカライズすることを計画している場合は、おそらく肯定的な兆候と否定的な兆候を得たいと思うでしょう。

編集 2:E Andreiは、ローカリゼーション変数でもあると指摘しました。ローカリゼーションについて私が知っていることを示します。

于 2010-08-06T14:57:07.563 に答える
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 に答える
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 に答える