DecimalFormat: entfernt falsches Komma

dako-ak

Mitglied
Hallo Leute,

ich habe folgendes Problem bei dem ich mir nicht sicher bin ob es überhaupt vernünftig lösbar ist.
Wenn der Benutzer in meiner Anwendung eine Zahl mit Nachkommstellen eingibt, dann wird je nach Sprache entweder '.' oder ',' als Komma verwendet.
Ich verwende auch Tausenderpunkte für die Formatierung der Zahlen.

Das Problem ist, wenn z.B. der deutsche User statt dem ',' fälschlicherweise ein '.' verwendet, dann entfernt das DecimalFormat einfach die Punkte.
Folgendes vereinfachtes Beispiel in dem ich die Sprache fest setze:

Java:
public static void main(String[] args) {
		System.out.println("start");
		
		DecimalFormatSymbols symbols = new DecimalFormatSymbols(new Locale("de"));
		NumberFormat numFormat = new DecimalFormat("###,###.###", symbols);
		try {
			Number num = numFormat.parse("20.78");
			System.out.println("number=" + num.doubleValue());
                        // !!!! der output ist: number=2078.0
		} catch (ParseException e) {
			System.out.println(e);
		}
		System.out.println("ende");

	}

Wie man sieht wird so aus einem "20.78" eine "2078.0"
Habt ihr eine Idee wie man solche falschen Eingaben teilweise verhindern kann?
Ich mein, wenn der Benutzer 2000.123 angibt, dann hat er Pech, da hier davon ausgegangen wird das soll ein Tausendertrenner sein. Aber bei kleinen Zahlen wie im obigem Beispiel muss es doch einen Weg geben solche Falscheingaben zu verhindern, ohne, dass ich jetzt selbst einen Stringparser schreiben muss, oder?
 

jstei001

Aktives Mitglied
Du könntest die Länge des Eingabe Stringsabfragen z.B. 20.65 hat die Länge 5, dann überlegst du dir einen Schwellwert das heißt alle Zahlen kleiner der länge 5 haben kein "." als trennzeichen. Dann könntest du die Punkte durch "," ersetzen mit [c]String.replace(".",",");[/c].

Ich würde die Länge der Zahl vor dem "." abfragen ist die kleiner als 3 dann gibt es keine Tausender-Trenner und dann kann man entweder den "." ganz ignorieren oder halt eretzen oder was du halt machen willst.
 

dako-ak

Mitglied
Gut, dann komme ich wohl nicht darum herum eine eigene Parser-Routine zu schreiben.
Eigentlich ist es doch ein Bug, dass Strings mit falschen Tausendertrennern akzeptiert werden, oder?
20.78 ist ja keine gültige Zahl, wenn das Komma mit dem "," Zeichen erwartet wird. Und der Tausendertrenner ist an dieser Position auch nicht korrekt.
 

jstei001

Aktives Mitglied
Ich hab mich bis jetzt noch nicht mit den Number Klassen auseinander gesetzt, aber ich glaube "###" bedeutet Maximal 3 Stellen dann ein "," und dann wieder maximal 3 Stellen. Ich denke 20.78 wird so interpretiert : 20,00.78 Deshalb ist sie gültig, warum er daraus dann 2078 macht weiß ich auch nicht wie gesagt kenne die Number Klassen nicht, aber das findet man bestimmt über die Doku raus.
 
S

SlaterB

Gast
> Ich denke 20.78 wird so interpretiert : 20,00.78 Deshalb ist sie gültig, warum er daraus dann 2078

spielen 0en heutzutage keine Rolle? wie kann 2078 auf einmal zu 200078 werden und dann wieder zu 2078,
egal was wie darin an Punkt und Komma eingefügt und Bedeutung zugeordnet wird?

DecimalFormat arbeitet gewiss nicht so korrekt und vollständige, wie man es gerne haben könnte,
aber das ist ja noch ne Stufe schlimmer ;)
 

jstei001

Aktives Mitglied
Also ich habs mal selber bissl ausprobiert, solange hinter dem Punkt nicht mindestens drei zahlen kommen, wird der "." ignoriert. Frage ist jetzt was willst du machen wenn der User z.B. 20.78 eingibt soll es dann 20,78 sein?

Das wäre so zu Lösen

Java:
String str = "20.78";

String[] subStr = str.split("\\.");

//  wahrscheinlich Fehleingabe da nach dem ersten "." keine drei Ziffern folgen,
if(subStr[1].length<3){

 str.replace(".",",");

}

Sowas in der Art, ansonsten parsed der das ja schon richtig. Ich habe es jetzt so Verstanden bei dir, dass wenn der User 20.78 eingibt wahrscheinlich 20,78 meinte mit diesem beispiel kommt bei der Eingabe 20.78 dann 20.78 bzw. 20,78 auch raus
 
Zuletzt bearbeitet:

dako-ak

Mitglied
Ich denke ich werde eine Fehlermeldung ausgeben, dass das Zahlenformat nicht korrekt ist.

Schade, dass ich das selbst implementieren muss, da ich das besagte Problem in einer JSF-Anwendung habe und ich somit einen eigenen NumberConverter schreiben muss, welcher im Prinzip eine Kopie des original NumberConverters ist plus die besagten Änderungen.
 

bERt0r

Top Contributor
Was erwartest du denn? Wenn jemand auf deutsch 1.000 schreiben will, das Trennzeichen aber hier macht: 10.00 parst dir das NumberFormat ebenfalls eine Tausend. Von wo soll der Computer denn wissen, dass der Benutzer irrtümlich das falsche Zeichen eingegeben hat und eigentlich 10,00 schreiben wollte oder ob er den Punkt nur falsch gesetzt hat?
 

dako-ak

Mitglied
@Bertor:

Genau das ist doch das eigentliche Problem. Wenn der Benutzer eine Zahl falsch formatiert eingibt, dann gibt es keine Fehlermeldung sondern die eingegebene Zahl wird einfach manipuliert.

Man stelle sich vor ich gebe bei einer Überweisung irrtümlicherweise 10.50 ein und drücke auf absenden und im Endeffekt werden 1050 EUR überwiesen, statt mich auf den Fehler aufmerksam zu machen.

Wenn für das Komma das "," Zeichen verwendet wird, dann ist ein String von 10.50 keine gültige Zahl, ganz einfach, oder?
 

bERt0r

Top Contributor
Achso, das ist dann wohl weniger parsen als Gültigkeit prüfen mit regex.
Java:
	public static void main(String[] args) {
        System.out.println("start");
        
        String regex="\\d+(\\.(\\d){3})*(\\,\\d+)?";
        
        System.out.println(Pattern.matches(regex, "20.12"));
        System.out.println(Pattern.matches(regex, "2.000,12"));
        System.out.println(Pattern.matches(regex, "20"));
        System.out.println(Pattern.matches(regex, "20,12"));
        System.out.println(Pattern.matches(regex, "2,012"));
        System.out.println(Pattern.matches(regex, "2.000.0000,12"));
        System.out.println(Pattern.matches(regex, "2012"));
        
        System.out.println("ende");
    }
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
H2SO3- DecimalFormat Allgemeine Java-Themen 9
K DecimalFormat Frage Allgemeine Java-Themen 2
J DecimalFormat überprüfen Allgemeine Java-Themen 8
W DecimalFormat ohne Tausendertrenner Allgemeine Java-Themen 2
T Decimalformat, Fehler beim runden? Allgemeine Java-Themen 8
S Decimalformat gibt falsche Werte aus Allgemeine Java-Themen 3
J DecimalFormat vertauscht . und , Allgemeine Java-Themen 8
J DecimalFormat Allgemeine Java-Themen 4
L java.text.NumberFormat und java.text.DecimalFormat benutzen Allgemeine Java-Themen 2
N Zahl mit DecimalFormat formattieren Allgemeine Java-Themen 2
D problem mit decimalformat Allgemeine Java-Themen 5
Z macOS java konnte nicht entfernt werden xpc verbindungsfehler Allgemeine Java-Themen 4
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
S Programm das automatisch ungenutzten Source-Code entfernt..? Allgemeine Java-Themen 4
J Swing Wird invisible, nicht-ref. Fenster vom GC entfernt? Allgemeine Java-Themen 11
Y Falsches Ergebnis mit "/" Operator Allgemeine Java-Themen 2
M Falsches Ergebnis bei Rechnung Allgemeine Java-Themen 1
J-Gallus Erste Schritte Wahrscheinlich Anfänger Fehler beim rechnen. Falsches Ergebnis. Allgemeine Java-Themen 9
OnDemand Download Textdatei falsches Charset Allgemeine Java-Themen 1
D Timestamp to Date, ergibt falsches ergebnis Allgemeine Java-Themen 5
S Falsches Encoding bei Drag and Drop von Umlauten Allgemeine Java-Themen 16
L Gregorian Calender falsches Datum Allgemeine Java-Themen 2
A JSmooth nimmt falsches JRE! Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben