Frage

Ich versuche, mehr über Java zu verstehen Nachrichtenformat Dienstprogramme, und in Beispielen in unserer Codebasis und anderswo sehe ich beides {0} Und {0,number,integer} wird für Zahlen verwendet, aber ich bin mir nicht sicher, was, wenn überhaupt, vorzuziehen ist.

Ein kurzer Testdruck der Unterschiede:

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

Ausgänge:

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

Was mich überraschte, wenn überhaupt, hätte ich das erwartet {0} der Nummer nichts anzutun, und für {0,number,integer} um es richtig zu lokalisieren.Stattdessen werden beide lokalisiert, aber es scheint, dass die explizite Form immer die Lokalisierung en_US verwendet.

Laut der verlinkten Dokumentation, {0} wird durchgesetzt NumberFormat.getInstance(getLocale()) while while die explizite Form verwendet NumberFormat.getIntegerInstance(getLocale()).Wenn ich diese jedoch direkt aufrufe (die letzte Spalte in der Ausgabe), scheinen beide identisch zu sein und beide werden korrekt lokalisiert.

Was fehlt mir hier?

War es hilfreich?

Lösung

Du hast Recht.Wenn Sie „MessageFormat(“{0,number,integer}“) verwenden, verwendet der Formatierer zum Zeitpunkt der Initialisierung das Standardgebietsschema (en_US) und Zahlen werden für die Verwendung des Ganzzahlformats im Standardgebietsschema (en_US) markiert, während der folgende Code ausgeführt wird während der Initialisierungszeit selbst.

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

Da Sie das Gebietsschema später festlegen, hat dies keine Auswirkungen auf das den Zahlen zugewiesene Formatmuster.Wenn Sie das gewünschte Gebietsschema im Format für Zahlen verwenden möchten, verwenden Sie bitte das Gebietsschema-Argument zum Zeitpunkt der Initialisierung selbst, z. B.unten:

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

Andere Tipps

Meiner Meinung nach handelt es sich hierbei um einen Java-Bug (die Schnittstelle ist falsch) oder um ein Dokumentationsproblem.Sie sollten ein neues Problem bei Oracle eröffnen, um das zu beheben.

Wie Yogendra Singh sagte, wird die Instanz des Formatierers (DecimalFormat) beim MessageFormat-Konstruktor erstellt.

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

Wenn MessageFormat.setLocale aufgerufen wird, ändert es das Gebietsschema seiner internen Formatierer nicht.

Zumindest die Dokumentation sollte geändert werden, um dieses Problem widerzuspiegeln.

Das ist meine Java-Version:Java-Version "1.7.0_07" Java (TM) SE Runtime Umgebung (Build 1.7.0_07-B11)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top