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.ChoiceFormat
sł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 ChoiceFormat
i MessageFormat
, między nimi występuje kolizja między metaznakami. ChoiceFormat
zastosowania #
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 MessageFormat
i jest to metaznak, który ma znaczenie DecimalFormat
: jest to metaznak, który oznacza „umieść tutaj liczbę”.
Ponieważ jest zawinięty w ChoiceFormat
ciąg, #
należy go cytować. Po ChoiceFormat
zakoń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)