Uluslararasılaştırma vb. İle "gerçek dünya" kalıpları yapmaya çalışırken bununla biraz uğraştım. Spesifik olarak, çıktının gösterilen değerlere bağlı olduğu bir "seçim" formatı kullanma ihtiyacımız var ve bunun java.text.ChoiceFormatiçin var.
İşte bunun nasıl yapılacağına dair bir örnek:
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));
}
Bu, aşağıdaki çıktıyı üretir; Umarım aynı tür şeyleri başarmaya çalışan başkaları için yararlıdır:
zero!
one!
100
1000
10000
big: 100,000
big: 1,000,000
big: 10,000,000
Gördüğünüz gibi, "seçim" biçimi, biçimlendirilecek olan değere bağlı olarak kullanılacak biçim türünü seçmemize olanak tanır. Küçük sayılar metinle değiştirilebilir (orijinal değer görüntülenmez). Orta büyüklükteki sayılar, gruplama ayırıcıları olmadan (virgül olmadan) gösterilir. En büyük sayılar yine virgül içerir. Açıkçası, bu, esnekliğini göstermek için tamamen uydurulmuş bir örnektir java.text.MessageFormat.
#Biçim metninde alıntılananlar hakkında bir not : hem ChoiceFormatve hem MessageFormatde kullanıldığından, ikisi arasında meta karakterler arasında bir çakışma vardır. ChoiceFormatkullanımları #esasen vasıta "eşittir" bir meta karakter şekilde biçimlendirme motoru durumunda bu örneğin bilir 1#one!biz karşılaştırdığınız {0}ile 1ve eşit iseler, o kadar belirli bir "seçim" kullanır.
Ama #başka bir anlamı var MessageFormatve bu, DecimalFormat"buraya bir sayı koy" anlamına gelen bir meta karakterdir.
Bir ChoiceFormatdizgeye sarıldığı için, #alıntı yapılması gerekir. Ne zaman ChoiceFormatdizesini ayrıştırma yapılır için subformats geçerken, bu tırnaklar kaldırılır MessageFormat(ve sonra üzerine DecimalFormat).
Bu yüzden, kullanırken {0,choice,...}, bu #karakterleri ve muhtemelen diğerlerini alıntı yapmanız gerekir .
String.valueOf(long)