2015-06-11 12 views
8

Ich habe ein JFormattedTextField mit einem NumberFormat mit Locale.US. Also ist das Dezimaltrennzeichen der Punkt und das Gruppierungstrennzeichen ist das Komma.NumberFormat Parse nicht streng genug

Jetzt gebe ich die Zeichenfolge "1,23" in dieses Textfeld ein und verschiebe den Fokus auf eine andere Komponente. Ich würde erwarten, dass die Zeichenkette verschwindet (wie wenn ich "a" anstelle von "1,23" schreibe), da es offensichtlich keine gültige Darstellung einer Zahl ist, wenn Sie Locale.US verwenden. Stattdessen wird der Text im Textfeld in "123" geändert.

Dies liegt daran, dass das verwendete NumberFormat beim Parsen nicht streng ist und das Komma einfach ignoriert.

Frage: Wie kann ich NumberFormat anweisen, in diesem Fall eine ParseException auszulösen, damit das Textfeld nach dem Verschieben des Fokus auf eine andere Komponente leer ist?

Testcode:

JDialog dialog = new JDialog(); 
    JPanel panel = new JPanel(new BorderLayout()); 
    dialog.getContentPane().add(panel); 

    NumberFormat nf = NumberFormat.getInstance(Locale.US); 
    JFormattedTextField textField = new JFormattedTextField(nf); 
    textField.setText("1,23"); 
    panel.add(textField, BorderLayout.CENTER); 
    panel.add(new JButton("focus"), BorderLayout.EAST); 

    dialog.pack(); 
    dialog.setVisible(true); 

Bewegen Sie den Fokus aus dem Textfeld auf die Schaltfläche und der Text wird auf „123“ ändern.

+1

Dies ist kein Duplikat. Die andere Frage bezog sich auf Ganzzahlen, nicht auf Doppel. Die Frage hier läuft auf ein übermütiges NumberFormat hinaus, das nicht überprüft, ob ein Komma an dieser Position erlaubt ist. Sieht so aus, als ob wir eine Unterklasse von NumberFormat mit strengerer Überprüfung brauchen. –

+1

@RalfH: Sie haben Recht, das ist kein Duplikat. Ich habe die Frage bearbeitet, um die zugrunde liegende Verwendung von NumberFormat im JFormattedTextField anzuzeigen. –

+1

Wie kann ich das doppelte Label von dieser Frage entfernt bekommen? Ich würde gerne meine eigene Lösung veröffentlichen. –

Antwort

3

Ich würde vorschlagen, Sie Regex zu verwenden und das Spiel fucntion wie folgt verwenden:

matches("\\d+([.,])?") 

Auch wenn Sie Integer.parseInt(String) verwenden eine Exception aus, wenn sie analysiert werden oder können Sie verwenden Double.parseDouble(value)

0

Eigentlich ist Number nur eine super Klasse für Double, also könntest du Double.parseDouble(...) verwenden und dann sollte das automatische Auspacken den Rest erledigen.