€-Zeichen wird nicht akzeptiert

nieselfriem

Bekanntes Mitglied
Hallo Zusammen,

ich möchte bei der Eingabe es möglich machen, dass das Euro Zeichen akzeptiert wird. Am ende wird der wert zwar ohne dieses Zeichen umgerechnet. Es soll aber für den Nutzer "schön" sein, den Wert mit € einzugeben. Dazu habe ich folgenden Code.


Java:
package com.example.currecychectgpt;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import javafx.scene.text.TextAlignment;
import javafx.stage.Stage;

import java.util.function.UnaryOperator;

public class CurrecyChectGPT extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        TextField textField = new TextField();
        Text errorText = new Text("Invalid input");
        errorText.setFill(Color.RED);
        errorText.setTextAlignment(TextAlignment.RIGHT);

        // Create a UnaryOperator to filter the input
        UnaryOperator<TextFormatter.Change> filter = change -> {
            String input = change.getControlNewText();
            System.out.print(input);
            if (input.isEmpty() || input.matches("\\d+(\\.\\d{3})*(,\\d{0,2})?(\\s€)?")) {
                return change;
            }
            return null;
        };

        // Create a TextFormatter with the UnaryOperator
        TextFormatter<String> formatter = new TextFormatter<>(filter);

        // Bind the TextFormatter to the TextField
        textField.setTextFormatter(formatter);

        // Add a listener to the text property of the TextField to change the text color and display the error text
        textField.textProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue.isEmpty() || newValue.matches("\\d+(\\.\\d)*(,\\d{0,2})?(\\s€)?")) {
                System.out.println(newValue);
                textField.setStyle("-fx-text-fill: green");
                errorText.setVisible(false);
            } else {
                textField.setStyle("-fx-text-fill: red");
                errorText.setVisible(true);
            }
        });

        VBox root = new VBox(textField, errorText);
        Scene scene = new Scene(root, 300, 200);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Die Regex habe ich auch getestet in einem Regex-Tester. Das Match alles. Ich habe den Verdacht, dass kein € Zeichen bei der Eingabe ankommt, weil die Codierung evtl. nicht passt.

Was mach ich hierbei falsch?

VG niesel
 
Dann solltest erst einmal die Codierung prüfen:
  • Mit welcher Codierung arbeitet die Entwicklungsumgebung? Hast Du das dort richtig eingestellt?
  • Sind die Dateien korrekt formatiert?

Generell empfehle ich, da generell mit UTF-8 zu arbeiten.

Das Eurozeichen kannst Du aber auch mit dem Unicode Wert angeben - dann wäre eine falsche Codierung ausgeschlossen beim Übersetzen. Das € Symbol ist U+20AC, daher kannst Du es in einem String Literal als \u20AC angeben. (Aber das ändert nichts daran, dass die Codierung generell richtig eingestellt sein sollte!)
 
also die Zeichencodierung der IDE und der Dateien habe ich überprüft und sind alle auf utf-8. das \ua20AC im regex hat auch nichts gebracht

VG
 
Ich habe den Code einmal ausprobiert.

Das Problem ist die Überprüfung am Ende mit dem (\\s€).

Damit hast Du zwei Zeichen, die eingegeben werden müssen: erst ein Whitespace und dann das €. Wenn Du das Leerzeichen eingibst, dann hast Du aber eine ungültige Eingabe und das Leerzeichen wird nicht angenommen. Damit wird dann auch nie ein € angenommen.

Du kannst das \\s weglassen - dann kann man das € eingeben. Du kannst den aktuellen Code aber auch testen, indem Du eine Eingabe über die Zwischenablage machst. Dann hast Du nur eine Einfügeoperation und Du hast ein gültigen Text.
 
Danke für den Hinweiß.

ich habe die Regex jetzt wie folgt geändert

Java:
"\d+(\.\d{3})*(,\d{0,2})?(\s)?(\u20AC)?"

Damit kann ich nun 12,00 12,00€ und 12,00 €, 12, 12,0 eingeben. Sollte jetzt passen. 🙂

Danke für die Hilfe

VG
 

Zurück
Oben