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?

Foi útil?

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)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top