Abschnitt 6 · Lektion 4
Deutsche Zahlen
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
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
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
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
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.
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.
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, kostenlosZu 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.