QLineEdit und Darstellung von "10.000,00 €"

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
GiJay
User
Beiträge: 36
Registriert: Freitag 5. März 2021, 14:40
Wohnort: Ratingen
Kontaktdaten:

Moin,

ich komme mit dem Validator bzw InputMask nicht zu recht. Ich schreibe an einem kleinen Tool für eine Maklerin und da sollen eine paar Daten in eine SQLite-DB eingetragen werden. Das alles funktioniert (über Mapper) einwandfrei. Allein die Darstellung der Zahlen will mir nicht gelingen.

In einem QLineEdit-Widget möchte ich 1532,50 eingeben und wenn ich das Feld verlasse, möchte ich dort 1.532,50 € stehen habe. Ich verzeifel dran ...
Die InputMask habe ich ausgeklammert, da diese Leerzeichen einbaut.

Ich arbeite übrigens mit PyQt6. Wer kann mir helfen? Schon mal "Danke" fürs lesen !

Code: Alles auswählen

	# Miete
        finanz_miete_text = QLabel("Miete max.: ")
        box_kapital_layout.addWidget(finanz_miete_text)
        self.miete = QLineEdit()
        self.miete.setValidator(QDoubleValidator(0.01, 99999.99, 2))
        #self.miete.setInputMask("00000,00 €")
        self.miete.setAlignment(Qt.AlignmentFlag.AlignRight)
        box_kapital_layout.addWidget(self.miete)

        # Kaufpreis
        finanz_kauf_text = QLabel("Kaufpreis max. : ")
        box_kapital_layout.addWidget(finanz_kauf_text)
        self.kaufpreis = QLineEdit()
        self.kaufpreis.setAlignment(Qt.AlignmentFlag.AlignRight)
        box_kapital_layout.addWidget(self.kaufpreis)
Benutzeravatar
Axel-WAK
User
Beiträge: 62
Registriert: Dienstag 29. November 2022, 11:52

Wenn die Beträge kleiner als 10 000 € sind sollte das doch funktionieren

Code: Alles auswählen

self.miete.setInputMask("0.000,00 €")
OS: LMDE5 *** Homepage *** Github Seite
GiJay
User
Beiträge: 36
Registriert: Freitag 5. März 2021, 14:40
Wohnort: Ratingen
Kontaktdaten:

Hallo Axel,

vielen Dank für Deinen Beitrag. So etwas hatte ich auch schon probiert, aber es funzt nicht. Hier der Versuch nach Deinen Beispiel 500,20 einzugeben. Irgendwie entstehen immer Leerzeichen ...

Bild
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ist es ggf. ein gangbarer Weg, das Euro-Symbol rechts daneben als Label zu packen? Ich kann schon einen gewissen aesthetischen Vorteil bei deiner Loesung sehen, aber aus pragmatischen Gruenden kann das ja auch ein "spaeter"-Problem werden.
Benutzeravatar
Axel-WAK
User
Beiträge: 62
Registriert: Dienstag 29. November 2022, 11:52

etwas umständlich, funktioniert aber, schreiben ENTER drücken.

Code: Alles auswählen

from PyQt6.QtWidgets import (QMainWindow, QApplication, QVBoxLayout, 
                             QWidget, QLineEdit)

class mainWin(QMainWindow):
    def __init__(self, parent = None):
        super(mainWin, self).__init__(parent)
        self.setupUI()
        
    def setupUI(self):
        self.setGeometry(0, 0, 450, 200)
        central_widget = QWidget()
        vbox = QVBoxLayout()
        central_widget.setLayout(vbox)
        self.setCentralWidget(central_widget)
        self.miete = QLineEdit(placeholderText="0.00")
        self.miete.returnPressed.connect(self.set_money_text)
        vbox.addWidget(self.miete)

        
    def set_money_text(self):
        money = self.miete.text()
        money_text = ""
        if len(money) == 3:
            money_text = f"{money[:1]},{money[-2:]}"
        if len(money) == 4:
            money_text = f"{money[:2]},{money[-2:]}"
        if len(money) == 5:
            money_text = f"{money[:3]},{money[-2:]}"
        if len(money) == 6:
            money_text = f"{money[:1]}.{money[1:4]},{money[-2:]}"
        if len(money) == 7:
            money_text = f"{money[:2]}.{money[2:5]},{money[-2:]}"
        if len(money) == 8:
            money_text = f"{money[:3]}.{money[3:6]},{money[-2:]}"
        self.miete.setText(f"{money_text} €")


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    win = mainWin()
    win.setWindowTitle("Main Window")
    win.show()

    sys.exit(app.exec())
OS: LMDE5 *** Homepage *** Github Seite
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das laesst sich noch deutlich schicker machen, ohne feste Grenzen:

Code: Alles auswählen

def format_currency(euro_and_cents, dot_separator=",", thousands_separator="."):
    euro, cents = divmod(euro_and_cents, 100)
    thousands = []
    while euro:
        euro, below_thousand = divmod(euro, 1000)
        thousands.append(str(below_thousand))
    return f"{thousands_separator.join(reversed(thousands))}{dot_separator}{cents}"
Der Betrag muss dabei eine Ganzzahl mit cents als letzte zwei Stellen sein, also 1000 fuer 10 Euro, 0 cent.

Eigentlich kann Python solche Zahlformatierung auch mit seinm locale-System, aber das nervt in meinen Augen ziemlich, und basiert auch noch auf globalem Zustand, etc pp.

Das externe Modul Babel stellt die professionellere Alternative dar: https://babel.pocoo.org/en/latest/api/n ... t_currency - muss man natuerlich dann auch installieren.
GiJay
User
Beiträge: 36
Registriert: Freitag 5. März 2021, 14:40
Wohnort: Ratingen
Kontaktdaten:

Vielen Dank für die Antworten !

Ich werde mich an Axels Code halten.
Der Code von deets ist zwar "simpler", aber ich halte ihn für gar nicht so professionell. Die "Muss-"Eingabe von 00 stört ungemein. Ob ich einen Taschenrechner oder eine Excel-Tabelle nehme, eine 00-Eingabe benötige ich dort nicht. Nun eine neue "Eingabe-Technik" zu installieren, halte ich für nicht sehr anwenderfreundlich. Trotzdem Danke !!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Man kann auch einfach mal 100 nehmen. Oder dem Teil weglassen. Auch Axels Code unterstellt diese zwei Nachkommestellen.
Antworten