Trochę się z tym zmagałem, próbując tworzyć wzorce „świata rzeczywistego” z internacjonalizacją, itp. W szczególności musimy użyć formatu „wyboru”, w którym wynik zależy od wyświetlanych wartości i do tego właśnie java.text.ChoiceFormatsłuży.
Oto przykład, jak to zrobić:
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));
}
Spowoduje to wygenerowanie następującego wyniku; Mam nadzieję, że jest to pomocne dla innych, którzy próbują osiągnąć ten sam rodzaj rzeczy:
zero!
one!
100
1000
10000
big: 100,000
big: 1,000,000
big: 10,000,000
Jak widać, format „wybór” pozwala nam wybrać typ formatu do użycia w zależności od przekazywanej wartości do sformatowania. Małe cyfry można zastąpić tekstem (brak wyświetlania oryginalnej wartości). Liczby średniej wielkości są wyświetlane bez separatorów grupujących (bez przecinków). Największe liczby ponownie zawierają przecinki. Oczywiście jest to całkowicie wymyślony przykład pokazujący elastyczność java.text.MessageFormat.
Uwaga na temat cytatów #w tekście formatu: ponieważ używane są oba ChoiceFormati MessageFormat, między nimi występuje kolizja między metaznakami. ChoiceFormatzastosowania #jako metaznak że zasadniczo oznacza „równa się” tak, że silnik formatowania wie, że na przykład w przypadku 1#one!jesteśmy w porównaniu {0}z 1, a jeśli są one równe, używa tego konkretnego „wybór”.
Ale #ma inne znaczenie MessageFormati jest to metaznak, który ma znaczenie DecimalFormat: jest to metaznak, który oznacza „umieść tutaj liczbę”.
Ponieważ jest zawinięty w ChoiceFormatciąg, #należy go cytować. Po ChoiceFormatzakończeniu analizowania ciągu te cudzysłowy są usuwane podczas przekazywania podformatów do MessageFormat(a następnie do DecimalFormat).
Więc kiedy używasz {0,choice,...}, musisz cytować te #znaki i prawdopodobnie inne.
String.valueOf(long)