Question

J'essaie de comprendre plus au sujet de Java MessageFormat services publics, et dans les exemples dans notre base de code et d'ailleurs je vois les deux {0} et {0,number,integer} utilisé pour les numéros, mais je ne suis pas sûr que, le cas échéant, est préférable.

Un test rapide d'impression les différences:

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));
                }
            }
        }
    }
}

Sorties:

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

Ce qui m'a surpris, si quoi que ce soit je me serais attendu à l' {0} pour ne pas faire quelque chose pour le nombre, et pour {0,number,integer} pour localiser correctement.Au lieu de cela, les deux se localisent, mais il semble que la forme explicite utilise toujours en_US localisation.

Selon liés à la documentation, {0} est mis par NumberFormat.getInstance(getLocale()) tandis que la forme explicite utilise NumberFormat.getIntegerInstance(getLocale()).Pourtant, quand je l'appelle directement (la dernière colonne de la sortie) semblent identiques, et à la fois de localiser correctement.

Ce qui me manque ici?

Était-ce utile?

La solution

Vous êtes de droite.Lorsque vous utilisez "MessageFormat("{0,number,integer}")", formateur utilise les paramètres régionaux par défaut(fr) au moment de l'initialisation et les numéros sont marqués à utiliser format de nombre Entier dans les paramètres régionaux par défaut(en_US) comme le code ci-dessous est exécutée lors de l'initialisation du temps lui-même.

// 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);

Puisque vous êtes à la définition des paramètres régionaux par la suite, il n'y a pas d'impact sur le modèle de format affectées à des numéros.Si vous souhaitez utiliser le désir de paramètres régionaux dans le format pour les nombres, veuillez utiliser les paramètres régionaux argument au moment de l'initialisation de lui-même par exempleci-dessous:

MessageFormat test = new MessageFormat("{0,number,integer}", Locale.FRANCE);

Autres conseils

À mon avis, c'est un bug de Java (l'interface est mal) ou une documentation problème.Vous devriez ouvrir une nouvelle question à l'Oracle pour corriger cela.

Comme Yogendra Singh, a déclaré l'instance de la formateur (DecimalFormat) est créé lors de l'MessageFormat constructeur.

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

Lorsque le MessageFormat.setLocale est appelée, elle ne permet pas de modifier les paramètres régionaux de ses formateurs internes.

Au moins la documentation doit être modifié pour refléter cette question.

C'est ma version de java:java version "1.7.0_07" Java(TM) SE Runtime Environment (build 1.7.0_07-b11)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top