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.ChoiceFormat
iç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 ChoiceFormat
ve hem MessageFormat
de kullanıldığından, ikisi arasında meta karakterler arasında bir çakışma vardır. ChoiceFormat
kullanı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 1
ve eşit iseler, o kadar belirli bir "seçim" kullanır.
Ama #
başka bir anlamı var MessageFormat
ve bu, DecimalFormat
"buraya bir sayı koy" anlamına gelen bir meta karakterdir.
Bir ChoiceFormat
dizgeye sarıldığı için, #
alıntı yapılması gerekir. Ne zaman ChoiceFormat
dizesini 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)