[regexp] Preis-String Testen
-
Hallo
ich bastel grad einen Validator für Preise, die ein Produkt haben kann.
Also Beispiel: 10.100,45
Ungültige sind: 10.10.100,45
oder: 10.100,34,23Ich habe mir grade den Reg-Ausdruck ausgedacht: [0-9][[\.]?[0-9]{3}][\,]{1}[0-9]{2}
Leider lässt er auch die ungültigen Beispiele durch.Gibts da einen besseren Reg-Ausdruck?
-
Also wenn gültige Preise nur solche der Form 10.100,45 sind, dann müsste folgender RegEx es tun (Perl):
[0-9]*\.[0-9]{3},[0-9]{2}
Das ist jetzt halt so, dass am Anfang eine beliebig lange Zahl kommt, dann muss ein Punkt kommen, dann muss genau eine Zahl mit 3 Ziffern kommen, dann muss ein Komma kommen, und dann genau eine Zahl mit 2 Ziffern. Ich weiß halt nicht was da jetzt optional ist und was nicht, deshalb einfach mal so. Aber bei dem RegEx von mir besteht trotzdem noch das Problem, dass z.B. sowas wie 10.10.100,45 immer noch als richtig erkannt wird. Das liegt einfach daran, dass einfach in einer Zeile geschaut wird ob das Muster gefunden wird, und das würde ja hier gefunden werden:
10.10.100,45Deshalb könnte man jetzt z.B. sowas machen:
\s+[0-9]*\.[0-9]{3},[0-9]{2}\s+\s ist eine Charakterklasse für beliebige Whitespaces (also Leerzeichen, Tab usw...). Damit sagst du halt, dass dieser Ausdruck alleine stehen muss, da davor mindestens ein Whitespace und danach auch mindestens eins kommen muss
P.S. Allerdings nix getestet
-
DEvent schrieb:
Gibts da einen besseren Reg-Ausdruck?
Du suchst vermutlich sowas hier:
[0-9.,]**\d+(\.\d{3})*(,\d{2})?**[0-9.,]
Der fette Teil ist das Muster für die Preise. Die äußeren Sachen sind eine Abgrenzung - wie das was nep mit \s gemacht hat. Nur besser
Ach, ich seh grad, du willst . und , nicht optional haben? Musst es halt entsprechend anpassen. Für mich ist halt 100€ auch ein gültiger Preis.
-
Ach jetzt hab ich das gecheckt wie die Preise sein sollen. Man voll dumm... also da würde folgender RegEx es natürlich tun:
[0-9](\.[0-9]{3}),[0-9]{2}Da ist aber eben nach wie vor das oben beschriebene Problem, und das ist auch nicht so einfach zu lösen. Kommt halt drauf an wie die Preise bei dir im Text vorkommen. Wenn es z.B. so ist, dass die alle alleine in einer Zeile stehen, dann ist folgendes ausreichend:
^[0-9](\.[0-9]{3}),[0-9]{2}$Edit:
Ja an sowas wie bei minhen habe ich auch schon gedacht. Ist aber auch nicht perfekt. Wenn diese Preise z.B. in nem ganz normalen Text mit Sätzen drin vorkommen sollen, dann kann man da auch Probleme kriegen, aber genauso natürlich mit dem \s+.
Wenns nur in ner Zeile stehen sollen dann ist der natürlich auch gut, aber da tuts der jetzt von mir beschriebene RegEX genauso.Nochmal Edit:
Der ist sogar besser, da er nur den Preis zulässt. Bei dem von minhen könnte man z.B. auch sowas wie abc100,45 korrekt durchbringen, was aber wohl nicht gewünscht ist, wenn der Preis da alleine stehen soll.Also hängt halt immer davon ab
-
Ach, ich seh grad, du willst . und , nicht optional haben? Musst es halt entsprechend anpassen. Für mich ist halt 100€ auch ein gültiger Preis.
ähm klar meinte ich das 100 auch eine Option ist. Habe ich vergessen, sorry. (Halt normale Preisangabe, wie es halt üblich ist)
Aber big thx schonmal für die Antworten.
-
Ich hab das Reg von nep jetzt genommen:
^[0-9]+(\.[0-9]{3})*(,[0-9]{2}$)?
Dann ist der Nachkommateil optional und die Tausendertrennung auch. Aber sowas wie: .100.100,12 oder 10.100,12,12 ist nicht möglich.
Danke nochmal an beide.
-
Was ist mit 1.234.567,89 ? Wär doch ein gültiger Preis?
-
DEvent schrieb:
^[0-9]+(\.[0-9]{3})*(,[0-9]{2}$)?
Wenn du die explizite Aufzählung der Ziffern durch die Zeichenklasse "Ziffer" ersetzt, hast du meinen ursprünglichen Ausdruck: \d+(\.\d{3})*(,\d{2})?
Wollt's nur anmerken - denn auch wenn [0-9] auf den ersten Blick klarer aussieht, würde ich dennoch \d bevorzugen. Es ist besser die Klasse zu nehmen, wenn man die Klasse meint (nicht nur weil's Schreibarbeit spart) als die Klasse jedes Mal neu zu "erfinden".
-
THX 1138 schrieb:
Was ist mit 1.234.567,89 ? Wär doch ein gültiger Preis?
Ja klar, wieso nicht?
Wenn du die explizite Aufzählung der Ziffern durch die Zeichenklasse "Ziffer" ersetzt, hast du meinen ursprünglichen Ausdruck: \d+(\.\d{3})*(,\d{2})?
Wollt's nur anmerken - denn auch wenn [0-9] auf den ersten Blick klarer aussieht, würde ich dennoch \d bevorzugen. Es ist besser die Klasse zu nehmen, wenn man die Klasse meint (nicht nur weil's Schreibarbeit spart) als die Klasse jedes Mal neu zu "erfinden".Ja stimmt hast Recht

^\d+(\.\d{3})*(,\d{2}$)?
-
Ähm, um das ^ und $ solltest du dir vielleicht noch Gedanken machen. So erkennst du einen Preis nur am Zeilenanfang. Wenn sich ein Kommateil anschließt, darf der Preis nur alleine in der Zeile vorkommen. Ohne Nachkommastellen dagegen kann direkt folgen was immer will. Sicher dass du das willst? Und um THX 1138-Einfwurf sollte man sich auch Gedanken machen. Aber beide Sachen lassen sich mit den bisher gezeigten Mitteln lösen. Muss man wohl nicht vormachen, oder?

-
minhen schrieb:
Ähm, um das ^ und $ solltest du dir vielleicht noch Gedanken machen. So erkennst du einen Preis nur am Zeilenanfang. Wenn sich ein Kommateil anschließt, darf der Preis nur alleine in der Zeile vorkommen. Ohne Nachkommastellen dagegen kann direkt folgen was immer will. Sicher dass du das willst? Und um THX 1138-Einfwurf sollte man sich auch Gedanken machen. Aber beide Sachen lassen sich mit den bisher gezeigten Mitteln lösen. Muss man wohl nicht vormachen, oder?

Welcher Einwurf? Das kapiere ich grade nicht.
Das mit dem Zeilenanfang/-Ende muss schon so sein, weil das ist nur ein 1-Zeiliges Inputfeld, in das nur der Preis reinkommen darf.
-
Ja da hat minhen schon recht. Du hast da die Klammern hinten falsch gesetzt.
Hier jetzt mal der RegEx, so wie ich vermute dass er richtig sein sollte:
^[0-9]+(\.[0-9]{3})*(,[0-9]{2})?$Nimmt jetzt z.B. auch sowas wie nur 100 oder auch 1.000.000 .
Sollte jetzt also komplett das sein was du suchst.
-
nep schrieb:
Ja da hat minhen schon recht. Du hast da die Klammern hinten falsch gesetzt.
Hier jetzt mal der RegEx, so wie ich vermute dass er richtig sein sollte:
^[0-9]+(\.[0-9]{3})*(,[0-9]{2})?$Nimmt jetzt z.B. auch sowas wie nur 100 oder auch 1.000.000 .
Sollte jetzt also komplett das sein was du suchst.Danke

Ich habs ein wenig geändert, damit auch 1.000,1 möglich ist (also nur 1 Stelle nach dem Komma).
^\d+(\.\d{3})*(,\d{1,2})?$
Wenn man die Klasse \d benutzt, dann kann man sich doch etliche [] sparen.
-
Ja das stimmt schon, aber ich habs extra nochmal mit den Klammern geschrieben, da es so vielleicht für manche besser ersichtlich ist was das Teil tut.