Javaで長整数をセパレータなしの文字列としてフォーマットするにはどうすればよいですか?


122

簡単な質問ですが、ここで質問することはおそらく、次のドキュメントを理解しようとするよりも簡単ですMessageFormat

long foo = 12345;
String s = MessageFormat.format("{0}", foo);

観測値は「12,345」です。

望ましい値は「12345」です。

回答:


62

12
またはString.valueOf(long)
rsp

6
String.valueOf()がLong.toString()を呼び出す
Peter Lawrey

7
多分これは些細なことかもしれませんが、この場合は、文書化されていないLong.toString(foo)の動作に依存しています。そのため、私はダニエル・フォルトゥノフの答えを好みます。
John K

4
文書化されていません。download.oracle.com/javase/6/docs/api/java/lang/…を参照してください。
Rob H

3
わかりました。ただし、このソリューションはResourceBundleのメッセージフォーマットには適用できません。Tuto i18n
Guillaume Husta

332
MessageFormat.format("{0,number,#}", foo);

1
おかげで、私はMessageFormatプロパティインジェクションでこれを実行しようとしました。それを行うには複数の方法があります。
Philihp Busby 2011

3
私はこの方法を好む。言語プロパティファイルの形式を変更できるからです。
Pascal

2
完璧なソリューション!コードレベルではなく参照データにフォーマット/フォーマット解除オプションを保持するのに役立ちました-ありがとう!そして@SebastianRothが言ったように-これは受け入れられた答えであるはずです。
Ofer Lando

9
フォーマッタAPIで数値文字列をきれいにすることがデフォルトであり、明示的なものではない理由に、私は実際に驚いています
humblerookie

1
これは、パターンを引用する場合は選択形式の内部でも動作します:MessageFormat.format("{0,choice,0#no foos|1#one foo|1<'{0,number,#}' foos}"
GOTO 0

1

国際化などで「現実世界」のパターンを作成しようとすると、これに少し苦労しました。具体的には、出力が表示される値に依存する「選択」形式を使用する必要があり、それjava.text.ChoiceFormatが目的です。

これを行う方法の例を次に示します。

    MessageFormat fmt = new MessageFormat("{0,choice,0#zero!|1#one!|1<{0,number,'#'}|10000<big: {0}}");

    int[] nums = new int[] {
            0,
            1,
            100,
            1000,
            10000,
            100000,
            1000000,
            10000000
    };

    Object[] a = new Object[1];
    for(int num : nums) {
        a[0] = num;
        System.out.println(fmt.format(a));
    }

これにより、次の出力が生成されます。同じタイプのことを成し遂げようとしている他の人に役立つことを願っています:

zero!
one!
100
1000
10000
big: 100,000
big: 1,000,000
big: 10,000,000

ご覧のように、「選択」形式では、フォーマットするために渡される値に応じて、使用するフォーマットのタイプを選択できます。小さな数値はテキストで置き換えることができます(元の値は表示されません)。中規模の数値は、グループ化区切り文字なし(カンマなし)で表示されます。最大の数には、コンマも含まれます。明らかに、これはの柔軟性を示すために完全に考案された例ですjava.text.MessageFormat

引用さについての注意#形式のテキストで:両方以来ChoiceFormatMessageFormat使用されている、二つの間のメタ文字の間に衝突があります。本質的に「等しい」を意味するメタ文字としてChoiceFormat使用#するため、フォーマットエンジンは、たとえば1#one!と比較{0}1ている場合に、それらが等しい場合、その特定の「選択肢」を使用することを認識します。

しかし、に#は別の意味がありMessageFormat、それはに意味を持つメタキャラクターとしての意味ですDecimalFormat。「ここに数字を置く」ことを意味するメタキャラクターです。

それはに包まれていますのでChoiceFormat、文字列、#ニーズが引用されます。ときにChoiceFormat文字列を解析して行われているにサブフォーマットを渡すとき、これらの引用符は削除されますMessageFormat(そして、その後に上DecimalFormat)。

したがって、を使用する場合は{0,choice,...}、それらの#文字、および場合によっては他の文字を引用符で囲む必要があります。


0

最短の方法は

long foo = 12345;
String s = ""+foo;

3
そして、いつものように、これは次のnew StringBuilder("").append(foo).toString()ように拡張されるため、実際には最適ではありません。
RAnders00

1
@ RAnders00単一の文字列に数値を変換すると、あなたは、通常はそれを完全に避けることができ、コンテキストに応じて、最適な選択肢になることはほとんどありませんが、あなたが使用できる最も単純なパターンのために""+
ピーターLawrey

1
あなたは正しいですが、人々はいつもそれを指摘する傾向があるので、私はそれを指摘したかっただけです。
RAnders00

1
@ RAnders00 btwメッセージ形式を使用すると、桁違いに高価になり、この場合はさらに複雑になります。
Peter Lawrey、2016年

そうです、Long.toString()とにかくこのソリューションがバックグラウンドで使用するものなので、代わりに使用する必要があります:)
RAnders00


-6

あなたは試すことができます:

String s = new Long(foo).toString();

8
不要なオブジェクトの作成。ラッパークラスでnewを使用しないでください。
keiki
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.