Dezimalzahl mit Komma

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
Holzkopp
User
Beiträge: 12
Registriert: Samstag 24. Juli 2021, 20:49

Hey Leute,

ich versuche gerade Zahlen mit Komma anstelle Punkt in vernünftiger Formatierung zu verwenden. Es will nicht so recht funktionieren.

Das folgende Skript erwartet die Eingabe einer Zahl wie beispielsweise 123,45
Damit soll dann eine Berechnung durchgeführt werden und das Ergebnis wieder mit Komma ausgegeben werden, gerundet auf zwei Dezimalstellen.
Die Krönung währe jetzt natürlich noch ein Punkt für die Tausender.

Meine Versuche sehen bisher so aus:

Code: Alles auswählen

import locale
locale.setlocale(locale.LC_ALL, 'de_DE.utf8')

zahl = input("Zahl mit Komma? ")
zahl = locale.atof(zahl)
print(zahl, "ohne Formatierung")
print(f"{zahl:n} Zahl mit Komma")
print("%.2f Zahl mit 2 Dezimalstellen" %(zahl))
Das darf doch nicht so schwer sein?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie ich gerade in einem anderen Thema hier schrieb, benutz das Paket Babel: http://babel.pocoo.org/en/latest/numbers.html
senseye
User
Beiträge: 15
Registriert: Sonntag 12. September 2021, 23:00

Hallo,

Code: Alles auswählen

eingabe = input("Zahl mit Komma: ")                     #   z.b.: 123,45
punkt_dez = float(".".join(eingabe.split(",")))

rechnung = round(punkt_dez*3, 2)

komma_dez = ",".join(str(rechnung).split("."))          #   ohne 1000er Trennzeichen

print(komma_dez)
Ausgabe: 370,45

Code: Alles auswählen

eingabe = input("Zahl mit Komma: ")                     #   z.b.: 1234567,89
punkt_dez = float(".".join(eingabe.split(",")))

rechnung = round(punkt_dez*3, 2)

vor_komma, nach_komma = str(rechnung).split(".")

print(f'{int(vor_komma):_},{nach_komma}')               #   mit 1000er Trennzeichen _
Ausgabe: 3_703_703,67

Code: Alles auswählen

eingabe = input("Zahl mit Komma: ")                     #   z.b.: 1234567,89
punkt_dez = float(".".join(eingabe.split(",")))

rechnung = round(punkt_dez*3, 2)

vor_komma, nach_komma = str(rechnung).split(".")

trennzeichen_strich = f'{int(vor_komma):_}'
trennzeichen_punkt = ".".join(trennzeichen_strich.split("_"))

print(f'{trennzeichen_punkt},{nach_komma}')             #   mit 1000er Trennzeichen .
Ausgabe: 3.703.703,67

Ist zwar etwas umständlich, funktioniert aber...
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@senseye: Warum `split()` + `join()` statt einfach `replace()`, beziehungsweise `translate()`‽

Code: Alles auswählen

In [346]: f"{x:_}".translate(str.maketrans("._", ",."))                         
Out[346]: '1.234.567,89'

In [347]: f"{x:_}".replace(".", ",").replace("_", ".")                          
Out[347]: '1.234.567,89'
Das Ergebnis von `str.maketrans()` kann man als Konstante definieren, damit das nur einmal ausgeführt werden muss.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
senseye
User
Beiträge: 15
Registriert: Sonntag 12. September 2021, 23:00

Weil ich diese Funktionen noch nicht kannte, danke.
Antworten