Regex für Währung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

Hallo zusammen,

ich möchte in einem QT-Eingabefeld die Währungseingabe so steuern, dass nur ein richtiges Format eingeben werden kann. Dazu habe ich ein Regex geschrieben.

Es sollen Werte erlaubt sein wie 3454 oder 34,5 oder 45.4 oder 45,00 oder 45.00

Mein Problem ist aktuell, dass auch eingaben wie 34,,,,,.... erlaubt sind.
Dazu mal mein regex:

Code: Alles auswählen

\d+(\,|\.)?\d{0,2}
Dabei dachte ich, ich habe die Eingabe von , oder . mit

Code: Alles auswählen

(\,|\.)?
auf 0 bis max 1 limitiert. Was mach ich hier falsch?

VG niesel
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dir fehlen Anfangs- und Ende-Marker:

Code: Alles auswählen

deets@paleale MINGW64 ~/projects/GH28/video-player (master)
$ py36
Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 07:18:10) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> rex = re.compile(r"\d+(\,|\.)?\d{0,2}")
>>> rex.match("10.0")
<_sre.SRE_Match object; span=(0, 4), match='10.0'>
>>> rex.match("10.....")
<_sre.SRE_Match object; span=(0, 3), match='10.'>
>>> rex = re.compile(r"^\d+(\,|\.)?\d{0,2}$")
>>> rex.match("10.....")
>>> rex.match("10.")
<_sre.SRE_Match object; span=(0, 3), match='10.'>
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

Hi!

trotz der Begrenzer kann ich es leider noch wie oben geschrieben eingeben.

Code: Alles auswählen

validator = QRegExpValidator(QRegExp("^\d+(\,|\.)?\d{0,2}$"), editor)
VG niesel
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann ist das wohl eher eine Frage fuer die Qt-Foren ;)
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Wie __deets__ ja schon schrieb, scheint das kein Problem deines Regulären Ausdrucks zu sein. Zumindest funktioniert der in einem kleinen Beispiel recht zuverlässig:

[codebox=pycon file=Unbenannt.txt]
import re

input_list = ["42", "42,67", "42.67", "42,6", "42..67", "42,,676"]
for element in input_list:
x = re.search("^\d+(\,|\.)?\d{0,2}$", element)
print (x)
[/code]

Ausgabe:
[codebox=pycon file=Unbenannt.txt]
<_sre.SRE_Match object; span=(0, 2), match='42'>
<_sre.SRE_Match object; span=(0, 5), match='42,67'>
<_sre.SRE_Match object; span=(0, 5), match='42.67'>
<_sre.SRE_Match object; span=(0, 4), match='42,6'>
None
None
[/code]

Grüße
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

Hallo, ich kann das Problem nicht nachvollziehen.
Folgender Quellcode funktioniert mit deinem RegExp einwandfrei.

Python 3.5 und PyQT5

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys

from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

class RegExpTest(QWidget):
    Width = 270
    Height = 65
    
    def __init__(self):
        super(RegExpTest, self).__init__()
        layout = QVBoxLayout(self)
        
        self.edit = QLineEdit()
        regex = QRegExp("\d+(\,|\.)?\d{0,2}")
        validator = QRegExpValidator(regex)
        self.edit.setValidator(validator)

        layout.addWidget(self.edit)

        self.setGeometry(55, 55, RegExpTest.Width, RegExpTest.Height)
        self.setWindowTitle('RegExpTest')
        self.show()

def main():
    app = QApplication(sys.argv)
    qlineedit_regexptest = RegExpTest()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

Antworten