Blutiger Anfänger - Erste Schritte und schon Probleme

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
cvst1lleo
User
Beiträge: 3
Registriert: Montag 28. August 2023, 17:52

Hallo zusammen, danke für die Aufnahme in Euren ehrwürdigen Kreis, und sorry, dass ich schon so schnell mit solchem DAU-Krams komme.
Ich bin absoluter Neuling, nutze Linux-Mint, habe mit dem Buch "Schrödinger lernt Pthon" angefangen, und hänge bei folgendem Code fest:

Code: Alles auswählen

import locale
locale.setlocale(locale.LC_ALL, 'de_DE')
preis = input ("Der Preis?")
zahlung = input ("Was zahlt der Kunde?")
preis = locale.atof (preis)
zahlung = locale.atof (zahlung)
rueckgeld = zahlung-preis
print ("Wechselgeld:",
       locale.format_string('%.2f', rueckgeld))
Die Umgebung "Thonny" gibt folgendes aus:

Code: Alles auswählen

Error: unsupported locale setting
locale.py, line 608
IDLE gibt folgendes aus:

Code: Alles auswählen

Traceback (most recent call last):
  File "/usr/lib/python3.8/idlelib/run.py", line 559, in runcode
    exec(code, self.locals)
  File "/home/leon/Python/TestLocale.py", line 2, in <module>
    locale.setlocale(locale.LC_ALL, 'de_DE')
  File "/usr/lib/python3.8/locale.py", line 608, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting
Die Fehlermeldungen sagen mir mal so gar nichts, und im Buch wird davon ausgegangen, dass der Code so durchgeht.

Kann mir jemand eien Tipp geben?
Danke für Eure Zeit!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ist in dem System ansonsten das deutsche locale installiert?

Und das ist auch ein eher ätzendes und komplexes Thema. Würde ich mich als Anfänger nicht mit beschäftigen.
Benutzeravatar
cvst1lleo
User
Beiträge: 3
Registriert: Montag 28. August 2023, 17:52

__deets__ hat geschrieben: Montag 28. August 2023, 18:24 Ist in dem System ansonsten das deutsche locale installiert?
Das weiß ich gar nicht. Aber jetzt, wo Du den wahren Wert ansprichst, interessiert mich das auch nicht wirklich :D
Also Thema überspringen, und mich um die wirklich wichtigen Dinge kümmern. Ich habe da nämlich Spaß dran, und den will ich mir nicht durch unnütze Sachen verderben.

Hab vielen Dank!
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

cvst1lleo hat geschrieben: Montag 28. August 2023, 18:33
__deets__ hat geschrieben: Montag 28. August 2023, 18:24 Ist in dem System ansonsten das deutsche locale installiert?
Das weiß ich gar nicht.
Das lässt sich leicht herausfinden, indem du in deine shell "locale -a" eingibst. Das Problem könnte sein, dass die Locale bei dir vmtl. eher "de_DE.utf8" heißt. Das, was __deets__ meinte, ist davon aber unbenommen.
Benutzeravatar
cvst1lleo
User
Beiträge: 3
Registriert: Montag 28. August 2023, 17:52

nezzcarth hat geschrieben: Montag 28. August 2023, 18:37
Das lässt sich leicht herausfinden, indem du in deine shell "locale -a" eingibst. Das Problem könnte sein, dass die Locale bei dir vmtl. eher "de_DE.utf8" heißt. Das, was __deets__ meinte, ist davon aber unbenommen.
Tatsächlich, das war's! Einfach de_DE.utf8 eingegeben (erst die Bash befragt), und schon lief alles perfekt. Wouw, das macht echt Spaß.

Hab vielen Dank!
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei das nicht wirklich die Lösung ist, beziehungsweise keine die man einfach so auf andere Rechner/Systeme übertragen kann, weil diese Locale-Bezeichner von System zu System sehr unterschiedlich aussehen können. Das einzige was portabel ist, ist dort die leere Zeichenkette anzugeben. Das funktioniert auf jedem System und stellt die vom Benutzer eingestellte Locale ein.

Beim Formatieren würde man dann für das Rückgeld wohl noch ``monetary=True`` übergeben, da es sich ja um einen Geldbetrag handelt.

Was man Ausgangsprogramm auch etwas unschön ist, ist das `preis` und `zahlung` jeweils für Zeichenketten und Zahlen wiederverwendet werden. Üblicherweise bindet man einen Namen innerhalb eines Namensraums immer nur an Werte mit dem gleichen (Duck-)Typ. Man muss nicht jedes kleine Zwischenergebnis an einen Namen binden.

Code: Alles auswählen

#!/usr/bin/env python3
import locale


def main():
    locale.setlocale(locale.LC_ALL, "")
    preis = locale.atof(input("Der Preis? "))
    zahlung = locale.atof(input("Was zahlt der Kunde? "))
    rueckgeld = zahlung - preis
    print(
        "Wechselgeld:", locale.format_string("%.2f", rueckgeld, monetary=True)
    )


if __name__ == "__main__":
    main()
Da fehlt natürlich noch ein bisschen was. Das Programm sollte darauf reagieren wenn der Benutzer etwas eingibt was nicht in eine Zahl umgewandelt werden kann, und sowohl Preis als auch Zahlung sollten positiv sein. Und die Zahlung sollte mindestens so hoch wie der Preis sein, damit die Ausgabe vom Rückgeld sinnvoll ist.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten