mitmario.dev

Deutsche Zahlen

Python Sandbox 3 Min Lesezeit 6 BeispieleLektion 4 von 6

Auf einer deutschen Rechnung steht 1.234,50 €, und eine Zahl wie 2.499,99 nimmt float() gar nicht erst an. Deshalb stehen Kommazahlen in diesem Kurs seit Lektion 1.3 mit Punkt da, weil Python es so will. Und seit Lektion 2.4 sieht jeder Kassenbon aus wie aus einem amerikanischen Supermarkt.

Beide Lektionen haben ein Werkzeug für deutsche Zahlen versprochen, und hier ist es. Es geht in zwei Richtungen. Du willst eine Zahl so ausgeben, wie man sie in Deutschland schreibt, und eine deutsch geschriebene Zahl so einlesen, dass Python damit rechnen kann.

Tausender, aber amerikanisch

Tausender auf Amerikanisch
betrag = 1234.5
print(f"{betrag:.2f}")
print(f"{betrag:,.2f}")
print(f"{1234567.891:,.2f}")

Mit :.2f bekommst du zwei Nachkommastellen. Ein Komma davor, also :,.2f, setzt zusätzlich Trennzeichen zwischen die Tausender. Das ist fast, was man will. Nur eben auf Englisch, 1,234.50, mit dem Komma für die Tausender und dem Punkt vor den Nachkommastellen. Im Deutschen ist es genau umgekehrt. Komma und Punkt müssen also die Plätze tauschen.

Zweimal replace geht schief

Zweimal replace
text = f"{1234.5:,.2f}"
print(text)
text = text.replace(",", ".")
print(text)
text = text.replace(".", ",")
print(text)

Der erste Gedanke ist replace, zweimal hintereinander. Erst Komma zu Punkt, dann Punkt zu Komma. Heraus kommt 1,234,50.

Nach dem ersten Schritt steht da nämlich 1.234.50, und darin sind beide Trennzeichen Punkte. Welcher davon vorher das Komma war, weiß danach niemand mehr. Im zweiten Schritt werden beide zum Komma.

Ein Zwischenzeichen

Tausch über ein Zwischenzeichen
text = f"{1234.5:,.2f}"
text = text.replace(",", "X")
print(text)
text = text.replace(".", ",")
print(text)
text = text.replace("X", ".")
print(text + " €")
betrag = 1234567.891
print(f"{betrag:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".") + " €")

Wie das geht, weißt du, wenn du schon mal den Inhalt von zwei Gläsern tauschen wolltest. Man braucht ein drittes. Das Komma wird erst zu einem Zeichen, das in einer Zahl sonst nie vorkommt, hier ein X. Dann wird der Punkt zum Komma und zuletzt das X zum Punkt. Weil das Zwischenglas X heißt und nicht Punkt, geht diesmal nichts verloren. Noch ein Leerzeichen und € dahinter, und die Zahl steht so da wie auf einer Rechnung.

Hintereinander geschrieben passen die drei Schritte in eine Zeile, auch für Millionen. So steht es in den letzten beiden Zeilen des Beispiels.

Bequem ist das noch nicht. Überall, wo eine Zahl deutsch erscheinen soll, steht das Muster in voller Länge im Code. Im Abschnitt über Funktionen bekommt es deshalb einen eigenen Namen, und danach schreibt man nur noch diesen Namen hin.

Python bringt für Zahlen nach Landesart übrigens einen eigenen Werkzeugkasten mit, das Modul locale (Module kommen in Abschnitt 10). Dafür braucht es aber deutsche Sprachdaten im Betriebssystem. Windows und macOS haben sie, viele Linux-Server nicht. Auch der nicht, auf dem dein Code hier läuft, und dort antwortet Python mit locale.Error: unsupported locale setting. Ein Programm, das auf dem eigenen Rechner tadellos läuft und auf dem der Kollegin abstürzt, ist schlechter als drei replace.

Deutsche Zahlen einlesen

Deutsch geschrieben, als Zahl gelesen
text = "2.499,99"
ohne_punkt = text.replace(".", "")
print(ohne_punkt)
mit_punkt = ohne_punkt.replace(",", ".")
print(mit_punkt)
preis = float(mit_punkt)
print(preis * 2)

float("2.499,99") gibt einen ValueError, weil float kein Komma kennt. Der Weg zur Zahl hat zwei Schritte, und es kommt auf die Reihenfolge an. Erst fallen die Tausenderpunkte weg, dann wird das Komma zum Punkt. Danach steht da 2499.99, und daraus macht float() eine Zahl, mit der du rechnen kannst.

Die falsche Reihenfolge
text = "2.499,99"
falsch = text.replace(",", ".").replace(".", "")
print(falsch)
print(float(falsch) * 2)

Andersherum geht es schief, und zwar leise. Wird zuerst das Komma zum Punkt, stehen zwei Punkte im Text, 2.499.99, und im zweiten Schritt fliegen beide raus. Aus 2.499,99 Euro werden 249999, ohne jede Fehlermeldung. Wer so eine Rechnung verschickt, merkt es erst am Anruf.

Dreitausend oder drei
print(float("3.000"))
print(float("3.000".replace(",", ".")))
print(float("3.000".replace(".", "").replace(",", ".")))

Dieser Fall ist noch leiser. 3.000 heißt auf Deutsch dreitausend, und trotzdem gibt float("3.000") keinen Fehler, sondern 3.0. Für Python ist der Punkt eben das Dezimalzeichen, und drei Komma null null null ist eine völlig gültige Zahl. Wenn du nur das Komma zum Punkt machst und die Tausenderpunkte vergisst, werden aus dreitausend Euro drei, während es bei 2.499,99 wenigstens noch einen ValueError gibt. Erst mit beiden Schritten wird 3.000 als 3000.0 gelesen.

Was die Aufgabe will

Diesmal geht es um eine kleine Rechnung. Ein Preis kommt deutsch geschrieben aus rechnung.txt, dazu eine Menge. Herauskommen soll der Gesamtpreis, wieder deutsch geschrieben. Beide Richtungen aus diesem Artikel kommen darin vor, jede einmal.

Zum Mitnehmen

Python schreibt Zahlen amerikanisch. Damit sie deutsch dastehen, tauschen Komma und Punkt über ein Zwischenzeichen die Plätze, denn ohne das sähen nach dem ersten Schritt beide Trennzeichen gleich aus. Soll float() eine deutsche Zahl lesen, fallen zuerst die Punkte weg, und erst danach wird das Komma ersetzt.

Jetzt du

Basis Konto, kostenlos

Zu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.

Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.

In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.

Was in dieser Lektion steckt

  • Artikel mit 6 Beispielen zum Ausprobieren

    Steht hier, ohne Konto lesbar.

  • Aufgabe, dein Code läuft auf einem Server

    Öffnet sich mit dem Basis Konto.