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 ChoiceFormat
dan MessageFormat
sedang digunakan, ada benturan antara karakter meta di antara keduanya. ChoiceFormat
menggunakan #
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 ChoiceFormat
string, #
perlu dikutip. Ketika ChoiceFormat
selesai 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.
String.valueOf(long)