Seite 1 von 1

Blutiger Anfänger - Erste Schritte und schon Probleme

Verfasst: Montag 28. August 2023, 18:04
von cvst1lleo
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!

Re: Blutiger Anfänger - Erste Schritte und schon Probleme

Verfasst: Montag 28. August 2023, 18:24
von __deets__
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.

Re: Blutiger Anfänger - Erste Schritte und schon Probleme

Verfasst: Montag 28. August 2023, 18:33
von cvst1lleo
__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!

Re: Blutiger Anfänger - Erste Schritte und schon Probleme

Verfasst: Montag 28. August 2023, 18:37
von nezzcarth
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.

Re: Blutiger Anfänger - Erste Schritte und schon Probleme

Verfasst: Montag 28. August 2023, 22:19
von cvst1lleo
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!

Re: Blutiger Anfänger - Erste Schritte und schon Probleme

Verfasst: Dienstag 29. August 2023, 00:31
von __blackjack__
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.