Locale, Formatter und Scanner: Bug bei Gleitkommazahlen?

Ark

Top Contributor
Hallo, allerseits,

ich bastle gerade an diesem FAQ-Beitrag rum, und mir ist schon beim Schreiben etwas aufgefallen, das für mich wie ein Fehler aussieht, zumindest in meiner Java-Version:
Code:
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) Server VM (build 20.1-b02, mixed mode)
Im genannten Beitrag stelle ich Formatter und Scanner vor, um Gleitkommazahlen vom Anwender eingeben zu lassen bzw. für ihn wieder auszugeben. Allerdings scheint das zusammen mit Locale.GERMAN nur mit "%f" beim Formatter problemlos zu funktionieren. Bei "%g" und "%e" werden Dezimalpunkte statt -kommata verwendet, die der Scanner wiederum nicht mag. Folgender Code verdeutlicht dies:

[java=41] private static void bugOrFeature(){
final double[] value = new double[]{
0.0, -0.0, Double.NaN, Double.NEGATIVE_INFINITY,
Double.POSITIVE_INFINITY, Math.PI, 123456, 123456e20
};
final String[] format = new String[]{
"%f", "%g", "%e"
};

for(final String f : format){
System.out.println(f);
for(final double d : value){
System.out.print(d + "\t");
String s = new Formatter(Locale.GERMAN).format(f, d).out().toString();
// s = s.replaceAll("\\.", ","); // workaround
System.out.print(s + "\t");
final double si = new Scanner(s).useLocale(Locale.GERMAN).nextDouble();
System.out.println(si);
}
System.out.println();
}
}[/code]
Bei mir kommt es zu folgendem Fehler:
Code:
%f
0.0	0,000000	0.0
-0.0	-0,000000	-0.0
NaN	NaN	NaN
-Infinity	-Infinity	-Infinity
Infinity	Infinity	Infinity
3.141592653589793	3,141593	3.141593
123456.0	123456,000000	123456.0
1.23456E25	12345600000000000000000000,000000	1.23456E25

%g
0.0	0.00000	Exception in thread "main" java.util.InputMismatchException
	at java.util.Scanner.throwFor(Scanner.java:840)
	at java.util.Scanner.next(Scanner.java:1461)
	at java.util.Scanner.nextDouble(Scanner.java:2387)
	at Test.bugOrFeature(Test.java:57)
	at Test.main(Test.java:38)
Wenn man im Code die Zeile mit dem Kommentar "workaround" aktiviert, kommt kein Fehler mehr und der Scanner interpretiert auch jedes Komma korrekt. Für mich sieht das nach einem Fehler im Formatter aus, immerhin heißt es z.B. zu "%e" in der Dokumentation:
Requires the output to be formatted using computerized scientific notation. The localization algorithm is applied.
[…]
The magnitude is then represented as the integer part of a, as a single decimal digit, followed by the decimal separator followed by decimal digits representing the fractional part of a, followed by the exponent symbol 'e' ('\u0065'), followed by […]
(Hervorhebungen von mir.)

Weiß jemand, ob es sich tatsächlich um einen Bug oder um ein Feature handelt? Und wie sieht das in Java 7 aus? Ich habe zwar Suchmaschinen bemüht, aber zumindest ich konnte hierzu keine konkreten Hinweise finden (außer z.B. ähnliche Schwierigkeiten im Zusammenhang mit JTable etc.).

Ark
 
Zuletzt bearbeitet:

planetenkiller

Aktives Mitglied
Weiß jemand, ob es sich tatsächlich um einen Bug oder um ein Feature handelt?
Ich tendiere ja eher zu Bug:
Source Code von Formatter:
Bei %f
[java=3227]
localizedMagnitude(sb, mant, f, newW, l); // l=Locale
[/code]

bei %g
[java=3264]
localizedMagnitude(sb, mant, f, newW, null); // null als Locale?
[/code]

Und wie sieht das in Java 7 aus?
Bei Java7 wurde es wohl gefixt:
jdk7/jdk7-gate/jdk: src/share/classes/java/util/Formatter.java@501ca93ea3ef Zeilen 3308 & 3271 & 3235
 

Ark

Top Contributor
Vielen, vielen Dank. :) Ich habe mir zwar die Quelltexte meiner Version etwas angeguckt, aber konnte spontan keinen Fehler finden. Leider habe ich beim Verlinkten nicht die Revision finden können, mit der der Fehler behoben wurde … ???:L

Da ich gerade kein JDK 7 habe (und auch nicht in absehbarer Zeit installieren werde - über Neuerungen informiere ich mich natürlich trotzdem ;)), würde es mich freuen, wenn jemand mit JDK 7 (z.B. durch Ausführen des Codes oben) bestätigen könnte, dass der Fehler tatsächlich behoben wurde.

Ark
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Input/Output Jave.utill.logging ohne Default-Locale also in Englisch Allgemeine Java-Themen 3
R Locale für Türkei nicht in standard -java ? Allgemeine Java-Themen 1
N BigDecimal falsch formatiert bei Locale.GERMANY Allgemeine Java-Themen 3
S ResourceBundle: Locale Datei in Jar finden Allgemeine Java-Themen 3
R Locale spezifische DateFormat Strings? Allgemeine Java-Themen 3
H2SO3- Date "18.11.2002 20:02:33" trotz Locale.GERMAN nic Allgemeine Java-Themen 9
B locale Montenegro (java 1.4.2) Allgemeine Java-Themen 6
D Locale mit JCombobox umschalten Allgemeine Java-Themen 19
A ResourceBundle ohne LOCALE funkt nicht. Allgemeine Java-Themen 4
I Locale Allgemeine Java-Themen 3
S Locale Allgemeine Java-Themen 8
G SimpleDateFormat und Locale Allgemeine Java-Themen 10
H java.util.logging Formatter Optionen setzen Allgemeine Java-Themen 2
mongole Formatter + null Allgemeine Java-Themen 4
S System.out.printf() - Formatter (hexadezimal) Allgemeine Java-Themen 3
S java.util.Formatter Allgemeine Java-Themen 4
X Input/Output InputStream/Scanner(System.in) read()/hasNextLine() block unterbrechen Allgemeine Java-Themen 7
J Variablen Scanner als Klassenvariable Allgemeine Java-Themen 5
M Kein Scanner Fehler durch falsche EIngabe Allgemeine Java-Themen 4
Bluedaishi Twain Scanner im Netzwerk Allgemeine Java-Themen 10
B Scanner erkennt keinen Text in Textdatei, obwohl welcher drinsteht Allgemeine Java-Themen 10
J Scanner oder BufferReader Allgemeine Java-Themen 2
1 Java Scanner Allgemeine Java-Themen 2
W Was genau sind IOTools? Kann ich stattdessen nicht die Scanner Klasse verwenden? Allgemeine Java-Themen 3
A Scanner Variable Klassenimtern deklarieren Allgemeine Java-Themen 12
T Datentypen Scanner Allgemeine Java-Themen 4
A Erste Schritte If Abfragen + Scanner Allgemeine Java-Themen 7
P Input/Output java.util.Scanner in einer Schleife und Exception-Behandlung: Einlesen einer Zahl Allgemeine Java-Themen 4
D Arraylist/For Schleife/Scanner Allgemeine Java-Themen 30
P Input/Output Datei einlesen per Scanner(f) - mit Cron gehts nicht Allgemeine Java-Themen 1
S Erste Schritte Scanner in Methode einbauen Allgemeine Java-Themen 4
B QR Scanner WebCam Allgemeine Java-Themen 2
P Scanner als Inputstream für Java Prozess Allgemeine Java-Themen 4
H Scanner: Ausgabe erst nach Abbruch Allgemeine Java-Themen 8
S Bekomme mit Scanner und URL keine Html-Seite ausgelesen Allgemeine Java-Themen 3
J NetBeans Frage bezüglich der Scanner-Klasse Allgemeine Java-Themen 6
H Scanner soll einen Inputredirect einlesen, liest aber nicht jedes Wort ein. Allgemeine Java-Themen 3
X Scanner hört nach der 25. Zeile auf Allgemeine Java-Themen 6
A Split, Scanner, StringTokenizer oder PatternMatching für flexibles Dateieinlesen? Allgemeine Java-Themen 2
D java.util.InputMismatchException im Scanner -wieso? Allgemeine Java-Themen 5
K Scanner - große Textfile, nur 0 ab betim. Wert Allgemeine Java-Themen 4
D Scanner leer aber bufferedReader nicht?! Allgemeine Java-Themen 2
N Scanner läuft nicht durch Allgemeine Java-Themen 2
R Scanner mit Java Allgemeine Java-Themen 2
J Parser / Scanner / Tokenizer gesucht Allgemeine Java-Themen 3
J Problem mit Scanner-Stream Allgemeine Java-Themen 2
J Mit Scanner-Klasse eine Datei zeilenweise einlesen und nur bestimmte Zeichen abfragen Allgemeine Java-Themen 11
M Scanner-Methode: Mehrere Eingaben mit Exception behandeln Allgemeine Java-Themen 10
R Barcode Scanner mit JavaPos ansprechen Allgemeine Java-Themen 1
M Barcode-Scanner unterscheidung zur Tastertur Allgemeine Java-Themen 7
H Problem mit Scanner Klasse Allgemeine Java-Themen 7
E Wie Zeichen eingeben mit Klasse Scanner? Allgemeine Java-Themen 5
D Problem mit java.util.scanner: Falsche Ergebnisse Allgemeine Java-Themen 4
E Scanner Frage :) Allgemeine Java-Themen 8
A Unterschied Scanner und Matcher Allgemeine Java-Themen 5
S Problem mit Scanner Allgemeine Java-Themen 5
G Barcode (Strichcode)-Scanner Allgemeine Java-Themen 10
G Scanner.hasNext() beendet den Thread ohne Message Allgemeine Java-Themen 4
S Scanner Allgemeine Java-Themen 6
G Scanner-Generator zur Erkennung von Java Tokens Allgemeine Java-Themen 7
B Try/Catch in While-Schleife mit Scanner - Hilfe! Allgemeine Java-Themen 3
K Scanner.hasNext findet kein Ende Allgemeine Java-Themen 6
D ProcessBuilder und Scanner Probleme mit einigen Prozessen Allgemeine Java-Themen 2
S Die Methode close() der Klasse Scanner Allgemeine Java-Themen 3
G Scanner und Abbruchbedingung/Pattern Allgemeine Java-Themen 2
bernd java.util.Scanner erst ab Java 1.5? Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben