Bagaimana cara memformat bilangan bulat panjang sebagai string tanpa pemisah di Java?

122

Pertanyaan sederhana, tetapi saya berani bertaruh bahwa menanyakan di sini mungkin akan lebih mudah daripada mencoba memahami dokumentasi untuk MessageFormat:

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

Nilai yang diamati adalah "12,345".

Nilai yang diinginkan adalah "12345".

Daniel Fortunov
sumber

Jawaban:

62

Gunakan saja Long.toString(long foo)

Rob H.
sumber
12
AtauString.valueOf(long)
rsp
6
String.valueOf () memanggil Long.toString ()
Peter Lawrey
7
Mungkin ini sepele tetapi dalam hal ini Anda mengandalkan perilaku Long.toString (foo) yang tidak terdokumentasi. Karena alasan itu, saya lebih suka jawaban Daniel Fortunov.
John K
4
Itu tidak tidak berdokumen. Lihat download.oracle.com/javase/6/docs/api/java/lang/… .
Rob H
3
Oke, namun solusi ini tidak berlaku untuk pemformatan pesan di ResourceBundle. Tuto i18n
Guillaume Husta
332
MessageFormat.format("{0,number,#}", foo);
Daniel Fortunov
sumber
1
Terima kasih, saya mencoba melakukan ini dengan injeksi properti MessageFormat. Untung ada lebih dari satu cara untuk melakukannya!
Philihp Busby
3
saya lebih suka cara ini. karena memungkinkan saya untuk mengubah format di file properti bahasa saya.
Pascal
2
Solusi sempurna! Membantu saya menyimpan opsi format / unformat dalam data referensi alih-alih di tingkat kode - terima kasih! Dan seperti yang dikatakan @SebastianRoth - ini seharusnya jawaban yang diterima.
Ofer Lando
9
Saya benar-benar terkejut mengapa mencocokkan string numerik sebagai default dan bukan hal eksplisit dengan API formatter
humblerookie
1
Ini juga berfungsi dalam format pilihan jika Anda mengutip pola:MessageFormat.format("{0,choice,0#no foos|1#one foo|1<'{0,number,#}' foos}"
GOTO 0
1

Saya sedikit kesulitan dengan ini ketika mencoba melakukan pola "dunia nyata" dengan internasionalisasi, dll. Secara khusus, kita memiliki kebutuhan untuk menggunakan format "pilihan" di mana keluarannya tergantung pada nilai yang ditampilkan, dan untuk itulah java.text.ChoiceFormat.

Berikut adalah contoh cara menyelesaikannya:

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

Ini menghasilkan keluaran berikut; Saya harap ini membantu orang lain yang mencoba mencapai jenis hal yang sama:

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

Seperti yang Anda lihat, format "pilihan" memungkinkan kita untuk memilih jenis format yang akan digunakan bergantung pada nilai yang diteruskan untuk diformat. Angka kecil dapat diganti dengan teks (tidak ada tampilan dari nilai aslinya). Nomor berukuran sedang ditampilkan tanpa pemisah pengelompokan (tanpa koma). Angka terbesar memang menyertakan koma, sekali lagi. Jelas, ini adalah contoh yang dibuat-buat untuk menunjukkan fleksibilitas java.text.MessageFormat.

Catatan tentang kutipan #dalam format teks: karena keduanya ChoiceFormatdan MessageFormatsedang digunakan, ada benturan antara karakter meta di antara keduanya. ChoiceFormatmenggunakan #sebagai karakter meta yang pada dasarnya berarti "sama dengan" sehingga mesin pemformatan tahu bahwa misalnya dalam kasus 1#one!kita membandingkan {0}dengan 1, dan jika sama, mesin menggunakan "pilihan" tersebut.

Tetapi #memiliki arti lain untuk MessageFormat, yaitu sebagai metakarakter yang memiliki arti untuk DecimalFormat: itu adalah metakarakter yang berarti "taruh nomor di sini".

Karena dibungkus dalam ChoiceFormatstring, #perlu dikutip. Ketika ChoiceFormatselesai mem-parsing string, tanda kutip tersebut dihapus ketika meneruskan subformat ke MessageFormat(dan kemudian ke DecimalFormat).

Jadi saat Anda menggunakan {0,choice,...}, Anda harus mengutip #karakter tersebut, dan mungkin yang lainnya.

Christopher Schultz
sumber
0

Cara terpendek adalah

long foo = 12345;
String s = ""+foo;
Peter Lawrey
sumber
3
Dan, seperti biasa, ini berkembang menjadi new StringBuilder("").append(foo).toString()tidak terlalu optimal.
RAnders00
1
@ RAnders00 Mengubah angka menjadi satu string tidak mungkin menjadi opsi yang paling optimal, bergantung pada konteks Anda biasanya dapat menghindarinya sepenuhnya, tetapi untuk pola paling sederhana yang dapat Anda gunakan""+
Peter Lawrey
1
Anda benar, tetapi saya hanya ingin menunjukkannya karena orang selalu cenderung menunjukkannya.
RAnders00
1
@ RAnders00 btw menggunakan format pesan yang urutan besarnya lebih mahal, dan lebih rumit dalam hal ini.
Peter Lawrey
Ya, sebaiknya gunakan saja Long.toString()karena itulah yang digunakan solusi ini di latar belakang :)
RAnders00
-1

Sebagai alternatif String.formatdan java.util.Formattermungkin berhasil untuk Anda juga ...

Frank Grimm
sumber
-6

Kamu bisa mencoba:

String s = new Long(foo).toString();
mportiz08.dll
sumber
8
Pembuatan objek yang tidak perlu. Jangan pernah menggunakan new with wrapper.
keiki