Lutei um pouco com isso ao tentar fazer padrões do "mundo real" com internacionalização, etc. Especificamente, precisamos usar um formato de "escolha" em que a saída dependa dos valores exibidos, e java.text.ChoiceFormat
é para isso.
Aqui está um exemplo de como fazer isso:
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));
}
Isso gera a seguinte saída; Espero que seja útil para outras pessoas que estão tentando realizar os mesmos tipos de coisas:
zero!
one!
100
1000
10000
big: 100,000
big: 1,000,000
big: 10,000,000
Como você pode ver, o formato "escolha" nos permite escolher o tipo de formato a ser usado, dependendo do valor que está sendo passado para ser formatado. Números pequenos podem ser substituídos por texto (sem exibição do valor original). Números de tamanho médio são mostrados sem separadores de agrupamento (sem vírgulas). Os números maiores incluem vírgulas novamente. Obviamente, este é um exemplo totalmente artificial para demonstrar a flexibilidade de java.text.MessageFormat
.
Uma nota sobre a citada #
no texto formato: uma vez que ambos ChoiceFormat
e MessageFormat
estão sendo usados, há uma colisão entre metacharacters entre os dois. ChoiceFormat
usa #
como um metacaractere que significa essencialmente "iguais" para que o mecanismo de formatação saiba que, por exemplo, no caso de 1#one!
comparações {0}
com 1
, e se forem iguais, ele usa essa "escolha" específica.
Mas #
tem outro significado para MessageFormat
, e isso é como um metacaractere que tem significado para DecimalFormat
: é um metacaractere que significa "coloque um número aqui".
Por estar embrulhado em uma ChoiceFormat
sequência, é #
necessário citar. Quando a ChoiceFormat
análise é feita, essas aspas são removidas ao passar os subformatos para MessageFormat
(e depois para DecimalFormat
).
Então, quando você estiver usando {0,choice,...}
, precisará citar esses #
caracteres e possivelmente outros.
String.valueOf(long)