8 Stimmen

Warum folgt das Dezimaltrennzeichen in Java der Sprache des Gebietsschemas und nicht dem Land, und, was noch wichtiger ist, wie kann man es außer Kraft setzen?

Ich arbeite an einem internationalen Projekt und habe festgestellt, dass in Java die Wahl des Dezimaltrennzeichens von der Sprache des Gebietsschemas abhängt, nicht von dessen Land. Zum Beispiel:

DecimalFormat currencyFormatter = (DecimalFormat) NumberFormat.getInstance(new Locale("it","IT"));
System.out.println(currencyFormatter.format(-123456.78));

currencyFormatter = (DecimalFormat) NumberFormat.getInstance(new Locale("en","IT"));
System.out.println(currencyFormatter.format(-123456.78));

ergibt die folgende Ausgabe:

-123.456,78
-123,456.78

Ich hätte erwartet, dass es sich nach dem Land richtet, denn wenn ich mich in dem Land befinde, egal ob ich Englisch oder Italienisch spreche, werden die Zahlen in diesem Land mit dem Dezimaltrennzeichen als Komma geschrieben.

Meine Frage ist eine doppelte:

  1. Weiß jemand, warum dieses Verhalten der Sprache folgt?
  2. Was noch wichtiger ist: Kann mir jemand sagen, wie ich das Standardverhalten in Java ändern kann, um stattdessen der Sprache zu folgen?

Danke.

6voto

Joachim Sauer Punkte 290477

Es ist sehr, sehr wahrscheinlich, dass es auf Ihrem System kein bekanntes Gebietsschema "en_IT" gibt und dass Java kein solches Gebietsschema kennt.

Daher erhalten Sie die Ressourcen für das am nächsten liegende Gebietsschema, wie in diesem Hinweis in der JavaDoc von Locale :

Wenn Sie nach einer Ressource für einen bestimmten Ort fragen, erhalten Sie die beste verfügbare Übereinstimmung zurück, nicht unbedingt genau das, wonach Sie gefragt haben. Weitere Informationen finden Sie unter ResourceBundle .

El relevante Dokumentation in ResourceBundle zeigt, dass das Land allein nie als Kennung für die Suche nach einer bestimmten Ressource verwendet wird. Es werden nur die Sprache, die Sprache + das Land und die Sprache + das Land + die Variante verwendet.

4voto

Péter Török Punkte 111735

Aber wenn Sie ein Engländer sind und in Italien leben, ist es wahrscheinlich, dass Sie Ihre Zahlen immer noch auf die englische Art schreiben und Ihr Geld in Ihrem Kopf in Pfund zählen - und umgekehrt ;-)

Für mich erscheint dieses Verhalten vollkommen logisch. Und ich fürchte, es gibt vielleicht keine Möglichkeit, das zu erreichen, was Sie wollen :-(

Aktualisierung aufgrund des Kommentars von Oscar Reyes: In Java 6 können Sie mit NumberFormatProvider Ihr Ziel erreichen.

4voto

OscarRyz Punkte 189898

1.- Weiß jemand, warum dieses Verhalten der Sprache folgt?

Einer der ersten Aspekte, der sich in einer Anwendung je nach Gebietsschema ändert, ist die Sprache. Denken Sie an die Schweiz, wo sowohl Französisch als auch Deutsch als Amtssprachen gelten. Die Verwendung des Landes in diesem Szenario macht keinen Sinn, denn neben der Währung gibt es noch andere Aspekte (z. B. die Anzeige von Meldungen), die berücksichtigt werden müssen.

Das Gleiche gilt für eine Reihe von Ländern (Kanada ist ein weiteres Land, das mir in den Sinn kommt).

Das Land ist eine Option zur Spezialisierung dieser Sprache.

Da es kein "italienisches Englisch" gibt, macht en_IT nicht viel Sinn. Also wird "english" genommen und deshalb ist die zurückgegebene Instanz diejenige mit "en" Englisch.

2. und noch wichtiger, kann jemand Angaben dazu machen, wie man das Standardverhalten in Java ändern kann, um der Sprache zu folgen?

Sie meinen, das Land, richtig?

Die Antwort liegt in der Methode: NumberFormat.getAvailableLocales() was Sie wiederum zu: NumberFormatProvider die eine abstrakte Klasse ist, die Sie erweitern können, um die richtige NumberFormat für "en_IT" (was ziemlich sicher it_IT ergibt)

Wie man die neue Klasse installiert, entzieht sich meiner Kenntnis, aber ich denke, man muss sie irgendwo in der Datenbank hacken. jre Verzeichnis.

EDITAR

Wie ich vermute, sollte die Klasse unter jre/ext Ordner und das war's.

An anderer Stelle gibt es ein Projekt, das etwas Ähnliches getan hat, um "gl_ES" zu unterstützen ( Galizisch )

Hier finden Sie eine Anleitung zur Installation und zur Funktionsweise des Systems:

http://www.javagalician.org/install.html

Wenn Sie also eine Reihe von Instanzen für Italien (oder besser noch eine einzige) bereitstellen möchten, müssen Sie nur eine Instanz des NumberFormatProvider erstellen, die alle verfügbaren Sprachen anspricht.

2voto

Pops Punkte 29149

Ganz Java zu ändern ist eine große Aufgabe; soweit ich weiß, gibt es keine Möglichkeit, dies auf der JVM-Ebene zu tun. Sie können jedoch das Zahlenformat für Ihre speziellen Klassen/Projekte manuell auf so ziemlich jedes Gebietsschema (oder sogar imaginäre System) mit dem Befehl DecimalFormatSymbols-Klasse . Siehe "Ändern der Formatierungssymbole" im Abschnitt Java-Tutorials-Seite zur Formatanpassung für Beispiele und weitere Informationen.

Zugegeben, dies ist kein optimaler Ansatz, wenn Ihr Programm an mehr als drei oder vier verschiedenen Standorten eingesetzt wird, aber es könnte funktionieren, wenn Sie nur einige wenige unterstützen.

2voto

jarnbjo Punkte 33136

Ihre Annahme "Ich hätte erwartet, dass es sich nach dem Land richtet, denn wenn ich in dem Land bin, egal ob ich Englisch oder Italienisch spreche, werden die Zahlen in diesem Land mit dem Dezimaltrennzeichen als Komma geschrieben." ist falsch. Mehrere zweisprachige Länder haben sprachspezifische Formatierungsregeln für Zahlen. Unter den Ländern mit Formatierungsregeln im JDK von Sun gilt dies für Kanada, Indien und Luxemburg.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X