2

この質問と、小数の書式設定に関連する他のいくつかの SO の質問に多少関連しています (これらはすべて、この例では役に立ちませんでした)。

Long を String にフォーマットしようとしています (例: 123456 -> 012.345,6 (ピリオドの後にコンマが続くのは奇妙に思えるかもしれませんが、プロジェクトの要件です)。

私は書式設定のために DecimalFormat を試しています:

private static final DecimalFormat format = new DecimalFormat("##0.000,0");

ただし、インスタンス化中に例外がスローされます。

java.lang.IllegalArgumentException: 不正なパターン "##0.000,0"

また、事前にロケールを EU システムに変更することも実験しました。

NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.GERMAN);

このように数値をフォーマットするにはどうすればよいですか? DecimalFormat は間違った解決策ですか? NumberFormat を使用できますか? それとも、カスタム フォーマッタが必要ですか?

4

5 に答える 5

7

DecimalFormat直接構築することは避けるべきです。コンマは、ターゲット ロケールでの表示方法に関係なく、パターン定義でのグループ化に常に使用されます。同様に、小数点には常にピリオドが使用されます。これは非論理的に見えますが、これはパターン定義であることを覚えておく必要があります 。また、# と同様に、これらの文字は文字自体ではなく置換を表します。

NumberFormat f = NumberFormat.getInstance(Locale.GERMANY);
if (f instanceof DecimalFormat) {
    ((DecimalFormat) f).applyPattern("##0,000.0");
}
f.format(123456 / 10.0);

小数点以下の桁を取得するには、10 で割る必要があります。

于 2012-10-03T15:25:00.913 に答える
1

あなたの要求を見逃していたら申し訳ありませんが、非標準の数値表現が必要な場合は、フォーマッターを簡単に書くことができます:

static String formatLong(long value) {
        String ret = Long.toString(value);

        // Make the value 7 digits by prepending 0's
        while(ret.length()<7) ret="0"+ret;

        // Add a comma before the last digit
        ret = ret.substring(0,ret.length()-1)+","+ret.substring(ret.length()-1);

        // Add a period before the 4th digit
        ret = ret.substring(0,ret.length()-5)+"."+ret.substring(ret.length()-5);

        return ret;
    }

long a = 123456;
System.out.println(formatLong(a));

「012.345,6」を出力します

于 2012-10-03T15:34:43.763 に答える
1

http://docs.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html

これを試してみましょう

new DecimalFormat("0##,###.0");

コンマは区切り記号、ポイントは分数です。この2つを入れ替えることはできません。

この形式は、先頭のゼロ、重要な 2 桁、3 桁、端数または 0 の順に出力します。おもう。

したがって、取得できる最高値は 123456-> 012,345.6 です。

回避策:

int index1 = string.indexOf(',');
int index2 = string.indexOf('.');
string.setCharAt(index1, '.');
string.setCharAt(index2, ',');
于 2012-10-03T15:16:20.960 に答える
0

javadoc を読んだところによると、DecimalFormat は数値の整数部分の「グループ化」のみをサポートしています。つまり、小数点以下の部分です

  • これは',''.'.

  • setGroupingSize(int)それはまた、次のように言うjavadocによっても暗示されています

    「グループ化サイズは、数値の整数部分のグループ化セパレータ間の桁数です」 .

于 2012-10-03T15:37:16.403 に答える
0

このクラスを使用してDecimalFormatSymbols、グループ化と小数点記号を任意の文字に設定できます。Java チュートリアル (「書式設定記号の変更」セクション) に例が示されています: http://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html

パターン自体では、グループ化は常に a で示され,、小数点はa で示され.ます。

于 2012-10-03T15:24:37.200 に答える