Textfeld eingabe überprüfen ob es eine Zahl ist

Hallo Zusammen

Ich möchte in JavaFX eine Eingabe von einem Textfeld überprüfen ob es eine Zahl ist.

Bis jetzt hatte ich dies immer so gelöst:

		try {
			int d = Integer.valueOf(text);

			if (d > max || d < min) {
				return false;
			}
		} catch (NumberFormatException e) {
			return false;
		}
		return true;
	}```

Nun sehen meine Zahel jedoch so aus:



Nun hat Java bei jeder Zahl das Gefühl das es keine Zahl mehr ist, wegen dem Trennzeichen. Kann ich beim Umwandeln in den String irgendwie das gleiche Zahlenformat mitgeben?

ein Screenshot für die Eingabe?
kann man 4’000 oder was immer es ist nicht posten? :wink:

‚String zu int parsen‘ ist auch ein recht verbreitetes Standardthema,
was man auch mit etwas abweichenden Begriffen in Suchmaschinen bald finden sollte,

aber andererseits ja noch weniger los wenn niemand was fragt :wink:

        DecimalFormatSymbols unusualSymbols = new DecimalFormatSymbols(Locale.getDefault());
        unusualSymbols.setGroupingSeparator('\'');
        df.setDecimalFormatSymbols(unusualSymbols);

        System.out.println(df.parse("43'555'000"));

https://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html

oder im einfachen Falle das besondere Symbol schlicht herauslöschen (String.replace) und den Rest wie bisher parsen

Grundsätzlich kann man sowas mit einem DecimalFormat lösen, dem man ein hübsches “Muster” mitgeben kann, das festlegt, wie eine Zahl aufgebaut ist. Dann kann man mit “decimalFormat.parse(string)” den String entsprechend parsen.

Üblicherweise hängt diese Formatierung aber “nur” von der Locale ab. Deswegen kann man sich von der Klasse NumberFormat schon passende Formate abholen. Allgemein scheint diese Schreibweise mit dem ' im Französischen (Schweiz?!) verbreitet zu sein. Ggf. kann man auf die Default Locale zurückgreifen, und sich das NumberFormat einfach mit
NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.getDefault());

Eine wichtige Frage ist vielleicht: Wo kommt dieses ' her? Tippt das jemand händisch so ein? Vermutlich nicht. Vermutlich IST das schon ein “formatiertes Textfield”. Das sollte dann intern schon irgendwo das DecimalFormat bzw. NumberFormat kennen.

(Das wichtige daran ist: Es muss überall konsistent sein! Wenn man die Zahl “1000” in so ein Textfeld reinschreibt, und es da drin Amerikanisch zu “1,000” formatiert wird, und man es dann ausliest, und da ein Französisches “1’000” erwartet, kracht es halt…)

Wie auch immer, hier mal ein kleines Beispiel mit ein paar hardverdrahteten Locales und Patterns:

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;


public class DecimalFormatTest
{
    public static void main(String[] args)
    {
        exampleWithNumberFormatAndLocale();
        exampleWithDecimalFormatAndPattern();
    }
    
    private static void exampleWithNumberFormatAndLocale()
    {
        double number = 1234.56789;

        Locale locale = new Locale("fr", "CH");
        NumberFormat numberFormat = NumberFormat.getNumberInstance(locale);
        String formatted = numberFormat.format(number);
        double parsed = 0;
        try
        {
            parsed = numberFormat.parse(formatted).doubleValue();
        }
        catch (ParseException e)
        {
            e.printStackTrace();
        }
        System.out.printf("Formatted: %20s, Parsed: %20s
", formatted, parsed);
    }
    
    private static void exampleWithDecimalFormatAndPattern()
    {
        double number = 1234.56789;
        
        DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
        decimalFormatSymbols.setGroupingSeparator('\'');
        DecimalFormat decimalFormat = 
            new DecimalFormat("#,##0.###", decimalFormatSymbols);
        String formatted = decimalFormat.format(number);
        double parsed = 0;
        try
        {
            parsed = decimalFormat.parse(formatted).doubleValue();
        }
        catch (ParseException e)
        {
            e.printStackTrace();
        }
        System.out.printf("Formatted: %20s, Parsed: %20s
", formatted, parsed);
    }
}

Vielen Dank für die Antworten

Es kommt tatsächlich von daher das es von der französischen Schweiz kommt. Ich habe es nun mit der Lösung von SlaterB hinbekommen ohne viel verändern zu müssen.

Jedoch wer ich mir dazu Grundlegende Überlegungen machen müssen, wenn nämlich das Programm überall laufen sollte.

wenn es ein JFormattedTextField ist und dieses das ’ einbaut hilft vielleicht getValue() oder was immer sonst im Angebot ist, Locale nutzend,
wenn der User selber einfach so ’ eintippt hilft vielleicht die Locale falls passend,

sonst allgemein sicher schwierig, vielleicht manuelles Parsen, Sonderzeichen alle drei Ziffern als Tausendertrenner erkennen

wenn’s keine Kommastellen geben kann dass wäre auch das eine Variante: int d = Integer.valueOf(text.replaceAll(",|'|\\.",""));

bye
TT

@Timothy_Truckle sehr dünnes Eis, weil dann irgendjemand ganz schnell doch mal Zahlen z.B. Geld mit den üblichen 2 Nachkommastellen angibt. 1,00 Euro.

Was abgesehen vom vom validieren, bei dem ich auch in Richtung Locale tendiere, bei FX recht hilfreich sein kann und auch einfach umzusetzen ist, ist die geparste Zahl in einem Label anzuzeigen. Dann kann der User immer noch intervenieren. Genügend Platz scheint ja vorhanden zu sein.

In Swing würde man das wohl mit [japi]Document[/japi] machen…
Nur Zahlen in Textfeld eingeben