Probleme mit NumberFormat

Hallo,

ich hänge momentan an einem kleinen Problem und finde einfach keine Lösung. In einer Datenbank gibt es ein Feld Anschaffungswert. In diesem Feld können Beträge eingegeben werden und diese werden danach, sollten es gültige Eingaben sein, direkt als Währungszahl mit dementsprechender Formatierung angezeigt. Das funktioniert soweit, solange ich das Währungszeichen mit angebe.

Mein Code, mit dem ich das Format auf das Textfeld anwende, sieht bisher so aus:
Code:
// Initialize formats for formatted text fields
NumberFormat nf = NumberFormat.getCurrencyInstance();
NumberFormatter nff = new NumberFormatter(nf);
DefaultFormatterFactory currencyfactory = new DefaultFormatterFactory(nff);
tv_acquisitionvalue.setFormatterFactory(currencyfactory);
tv_acquisitionvalue.setFocusLostBehavior(JFormattedTextField.COMMIT_OR_REVERT);

Nun wurde gefragt, ob es möglich wäre, die Eingabe auch ohne das Währungszeichen gültig zu machen. Bisher verhält sich das Programm so:

  1. Im Feld steht der Wert 449,99 € (gültiger Wert)
  2. Ich möchte den Betrag korrigieren und trage 500 ein (ohne das €-Zeichen) und klicke auf ein anderes Feld/Button -> FocusLostBehavior sorgt dafür, dass bei ungültiger Eingabe der letzte gültige Wert wieder eingesetzt wird. Hätte ich 500 € eingetragen, würde das Programm es aktzeptieren und normal umwandeln.
Kriegt man das irgendwie hin, dass er hier die 500 auch ohne €-Zeichen korrekt in 500,00 wandelt?

Im Feld soll quasi am Schluss der korrekt formatierte Wert ohne das Währungszeichen stehen.
 
Warum entscheidest du nicht einfach anhand des Wertes was für einen Formatter du nimmst. Wenn keine Währung angegeben wird, behandelst du den Text eben wie eine ganz normale Zahl und nimmst bspw. einen DecimalFormat. Oder du stellst sicher, dass die Währung immer angegeben wird (indem du bspw das € - Zeichen einfach anfügst wenn es nicht da ist).
 
Warum entscheidest du nicht einfach anhand des Wertes was für einen Formatter du nimmst. Wenn keine Währung angegeben wird, behandelst du den Text eben wie eine ganz normale Zahl und nimmst bspw. einen DecimalFormat. Oder du stellst sicher, dass die Währung immer angegeben wird (indem du bspw das € - Zeichen einfach anfügst wenn es nicht da ist).
Das mit dem DecimalFormat könnte ich mal testen. Das mit dem Nachtragen des €-Zeichens habe ich schon probiert gehabt, das hat leider (aus welchen Gründen auch immer) nicht funktioniert.
Leider habe ich den Codeschnipsel nicht mehr im Projekt wo ich das getestet hatte, aber im Prinzip hatte ich versucht, auf dem ActionListener des Save-Buttons zu prüfen, ob in der Textbox das €-Zeichen vorhanden war. Falls nicht, sollte es (BEVOR die eigentliche Savemethode durchgeführt wird) angefügt werden.
Das hatte ich versucht mit getValue und setValue sowie mit getText und setText, hat beides nichts gebracht.

EDIT: Mir ist gerade beim Schreiben eine Idee gekommen. Ich versuche mal, das Nachtragen des €-Zeichens auf den FocusListener der entsprechenden Textbox zu setzen, vielleicht funktioniert es so. Ich werde berichten. 🙂

@Testsubjekt_X Kannst Du noch mal 'etwas' verständlicher beschreiben was das Ziel wäre?
Das Feld um dass es geht wird beim Speichern auf einen gültigen Währungswert geprüft.

Beispiel:
In dem Feld steht 0,00 €. Trage ich in das Feld 523 € ein und klicke auf Speichern (bzw. ändere den Fokus auf ein anderes GUI Objekt), so wird der Wert automatisch in 523,00 € umgewandelt.
Trage ich jedoch 523 ein (ohne € Zeichen), und klicke auf Speichern, wird der Wert nicht als gültiger Währungswert angenommen und zurückgesetzt auf den letzten gültigen Wert (0,00 €).

Was ich möchte ist, dass die Eingabe ohne zusätzliches €-Zeichen trotzdem wie ein Währungswert behandelt wird. Hoffe das war verständlicher. 😀
 
Erstmal vielen Dank für eure Hilfe und Tipps. Das mit dem FocusListener hat funktioniert... hätte ich auch mal vorher drauf kommen können.

EDIT: Ich nehme an, dass der FocusListener der Box vor dem FocusLostBehavior des Formatters ausgelöst wird und wiederum FocusLostBehavior vor dem ActionListener des Buttons, auf dem ich ursprünglich auf das €-Zeichen geprüft hatte. Deshalb hatte es gestern nicht funktioniert. Lasse mich da aber gerne belehren, falls es anders wäre.

Java:
tv_acquisitionvalue.addFocusListener(new FocusListener() {
    @Override
    public void focusGained(FocusEvent e) {

    }

    @Override
    public void focusLost(FocusEvent e) {
        if (!tv_acquisitionvalue.getText().contains("€")) {
            tv_acquisitionvalue.setText(tv_acquisitionvalue.getText() + " €");
        }
    }
});

Euch noch ne gute Woche. 🙂
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben