Qual é a diferença entre {0} e {0,o número,o número inteiro}
-
12-12-2019 - |
Pergunta
Estou tentando entender mais sobre Java MessageFormat utilitários, e em exemplos em nossa base de código e em outros lugares eu vejo tanto {0}
e {0,number,integer}
sendo usada para os números, mas eu não tenho certeza de que, se qualquer um, é preferível.
Um teste rápido de impressão as diferenças:
import java.text.MessageFormat;
import java.text.NumberFormat;
import java.util.Locale;
public class MessageFormatTest
{
public static void main(String[] args){
MessageFormat simpleChoiceTest = new MessageFormat("{0}");
MessageFormat explicitChoiceTest = new MessageFormat("{0,number,integer}");
int[] set = new int[]{0,1,4,5,6,10,10000,24345};
Locale[] locs = new Locale[]{Locale.US,Locale.UK,Locale.FRANCE,Locale.GERMANY};
for(Locale loc : locs){
simpleChoiceTest.setLocale(loc);
explicitChoiceTest.setLocale(loc);
for(int i : set){
String simple = simpleChoiceTest.format(new Object[]{i});
String explicit = explicitChoiceTest.format(new Object[]{i});
if(!simple.equals(explicit)){
System.out.println(loc+" - "+i+":\t"+simple+
"\t"+NumberFormat.getInstance(loc).format(i));
System.out.println(loc+" - "+i+":\t"+explicit+
"\t"+NumberFormat.getIntegerInstance(loc).format(i));
}
}
}
}
}
Saídas:
fr_FR - 10000: 10 000 10 000
fr_FR - 10000: 10,000 10 000
fr_FR - 24345: 24 345 24 345
fr_FR - 24345: 24,345 24 345
de_DE - 10000: 10.000 10.000
de_DE - 10000: 10,000 10.000
de_DE - 24345: 24.345 24.345
de_DE - 24345: 24,345 24.345
O que me surpreendeu, se nada do que eu teria esperado a {0}
para não fazer nada para o número, e para {0,number,integer}
para localizá-lo corretamente.Em vez disso, ambos se localizada, mas parece que a forma explícita utiliza sempre en_US localização.
De acordo com a documentação vinculada, {0}
fica colocado através de NumberFormat.getInstance(getLocale())
enquanto a forma explícita usa NumberFormat.getIntegerInstance(getLocale())
.Ainda quando eu chamar aqueles diretamente (a última coluna na saída) ambos parecem idênticos, e ambos localizar corretamente.
O que estou ausente aqui?
Solução
Você está certo.Quando você usar "MessageFormat("{0,o número,o número inteiro}")", formatador usa a localidade padrão(en_US) no momento da inicialização e números estão marcadas para usar o formato de número Inteiro na localidade padrão(en_US) como o código abaixo é executado durante a inicialização do tempo em si.
// this method is internally called at the time of initialization
MessageFormat.makeFormat()
// line below uses default locale if locale is not
// supplied at initialization (constructor argument)
newFormat = NumberFormat.getIntegerInstance(locale);
Desde que você definir o locale depois, não há impacto sobre o formato padrão atribuídas a números.Se você deseja usar o desejo de localidade, no formato de números, por favor, use o argumento de localidade no momento da inicialização do si exemplo:abaixo:
MessageFormat test = new MessageFormat("{0,number,integer}", Locale.FRANCE);
Outras dicas
Na minha opinião, este é um Java bug (o interface está errado) ou um problema de documentação.Você deve abrir uma nova questão Oracle para corrigir isso.
Como Yogendra Singh, disse que a instância do formatador (DecimalFormat) é criado quando o MessageFormat construtor.
MessageFormat simpleChoiceTest = new MessageFormat("{0}");
System.out.println(simpleChoiceTest.getFormatsByArgumentIndex()[0]);
//Prints null
MessageFormat explicitChoiceTest = new MessageFormat("{0,number,currency}");
System.out.println(explicitChoiceTest.getFormatsByArgumentIndex()[0]);
//Prints java.text.DecimalFormat@67500
Quando o MessageFormat.setLocale é chamado de não alterar a localidade de sua interno formatadores.
Pelo menos a documentação deverá ser alterado para refletir essa questão.
Essa é a minha versão de java:versão de java "1.7.0_07" Java(TM) SE Runtime Environment (build 1.7.0_07-b11)