Я немного боролся с этим, пытаясь создать шаблоны «реального мира» с интернационализацией и т. Д. В частности, нам необходимо использовать формат «выбора», в котором вывод зависит от отображаемых значений, и это то 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)