Я трохи боровся з цим, намагаючись зробити інтернаціоналізацію "реального світу" тощо. Зокрема, у нас є потреба у використанні формату "вибір", коли вихід залежить від відображуваних значень, і саме java.text.ChoiceFormat
для цього потрібно.
Ось приклад того, як це зробити:
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));
}
Це генерує такий вихід; Я сподіваюся, що це корисно для інших, хто намагається досягти одних і тих же речей:
zero!
one!
100
1000
10000
big: 100,000
big: 1,000,000
big: 10,000,000
Як бачимо, формат "вибір" дозволяє нам вибрати тип використовуваного формату залежно від значення, яке передається для форматування. Невеликі цифри можна замінити текстом (відсутність відображення вихідного значення). Середні величини показані без розділових груп (без коми). Найбільшу кількість знову включають коми. Очевидно, що це цілком надуманий приклад для демонстрації гнучкості java.text.MessageFormat
.
Примітка про цитований #
у тексті формат: оскільки обидва ChoiceFormat
і MessageFormat
використовуються, між ними виникає зіткнення метахарактерів. ChoiceFormat
використовує в #
якості метасимвола , що по суті означає «дорівнює» , так що форматування двигун знає , що , наприклад , в разі 1#one!
ми порівнюємо {0}
з 1
, і якщо вони рівні, він використовує цей конкретний «вибір».
Але це #
має інше значення MessageFormat
, і це як метахарактер, який має значення для DecimalFormat
: це метахарактер, що означає "поставити число сюди".
Оскільки він загорнутий у ChoiceFormat
рядок, #
потрібно процитувати. Коли ChoiceFormat
буде зроблено розбір рядка, ці лапки видаляються при передачі підформатів до MessageFormat
(а потім у до DecimalFormat
).
Тож, коли ви користуєтесь {0,choice,...}
, ви повинні цитувати цих #
символів та, можливо, інших.
String.valueOf(long)