Seite 1 von 1

Eurozeichen ausgeben?

Verfasst: Montag 30. Mai 2016, 20:40
von Yadgar
Hi(gh)!

Ich habe begonnen, diverse Python-Tutorials durchzuarbeiten, dazu auch Übungsaufgaben (z. B. hier: http://www.informatik.uni-rostock.de/~n ... ben/blatt1)... dabei stieß ich auf folgendes Problem:

Im Rahmen der Aufgabe 4 im oben verlinkten Arbeitsblatt soll u. a. eine Liste angezeigt werden, die das Eurozeichen enthält. Ich bekomme als Ausgabe aber nur verhackten Hexadezimal-Salat:

\xe2\x82\xac'

obwohl am Anfang des Skripts #-*- coding: utf-8 -*- steht.

Hier der Code:

Code: Alles auswählen

#-*- coding: utf-8 -*-
einheiten = [50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1]
muenzen = []
scheine = []
euro = float(input("Bitte einen Euro-Betrag eingeben!"))
euro = int(euro * 100)
anzahl = 0
anzahlScheine = 0
anzahlMuenzen = 0
element = 0

while element <= 14:
  if int(euro//einheiten[element]) == 0:
    element += 1
  else:	
    aktAnzahl = int(euro//einheiten[element])
    if element < 7:
      anzahlScheine += aktAnzahl
    else:
      anzahlMuenzen += aktAnzahl
    for i in range (0,aktAnzahl):
      if element < 9:
	muenze = str(int(einheiten[element]/100))+"€"
      else:
	muenze = str(einheiten[element])+"c"
      if element < 7:
	scheine.append(muenze)
      else:
	muenzen.append(muenze)
    euro %= int(einheiten[element])
    element += 1
print("Man braucht mindestens")
if anzahlScheine > 0:
  print anzahlScheine,"Scheine:",scheine
if anzahlScheine > 0 and anzahlMuenzen > 0:
  print "und"	
if anzahlMuenzen > 0:
  print anzahlMuenzen,"Münzen:",muenzen
Bis bald im Khyberspace!

Yadgar

Re: Eurozeichen ausgeben?

Verfasst: Montag 30. Mai 2016, 21:14
von snafu
Yadgar hat geschrieben:obwohl am Anfang des Skripts #-*- coding: utf-8 -*- steht.
Das sagt dem Interpreter nur, in welchem Format der Programmcode vorliegt. Hier geht es aber um ein Problem mit der Ausgabe. Die Ausgabe des Eurozeichen gehört zu den Baustellen, die Python unter Windows hat, bei denen eine zeitnahe Lösung nicht absehbar ist. Am einfachsten ist es, mit dem Befehl ``pip install win_unicode_console`` ein Package zu installieren, das genau dieses Problem löst.

Probiere nach der Installation mal das hier:

Code: Alles auswählen

import win_unicode_console
win_unicode_console.enable()
print '€'
Bei mir erscheint dann das Euro-Zeichen auf dem Bildschirm – es funktioniert also.

Re: Eurozeichen ausgeben?

Verfasst: Montag 30. Mai 2016, 22:22
von Yadgar
Hi(gh)!
snafu hat geschrieben: Das sagt dem Interpreter nur, in welchem Format der Programmcode vorliegt. Hier geht es aber um ein Problem mit der Ausgabe. Die Ausgabe des Eurozeichen gehört zu den Baustellen, die Python unter Windows hat, bei denen eine zeitnahe Lösung nicht absehbar ist.
Oops, ich hatte vergessen zu erwähnen, dass das Problem nicht unter Windows (genauer, Windows 7) - da funktioniert der von mir gepostete Code einwandfrei - sondern unter Linux auftritt!

Bis bald im Khyberspace!

Yadgar

Re: Eurozeichen ausgeben?

Verfasst: Montag 30. Mai 2016, 22:58
von snafu
Da hattest auch gar nichts vom Betriebssystem geschrieben. Keine Ahnung, wieso ich auf Windows gekommen bin. Also bei mir ist es genau umgekehrt wie bei dir: Windows (PowerShell) erzeugt ein Fragezeichen anstelle des Eurozeichens. Linux Mint (gnome-terminal) funktioniert ganz normal.

Was sagt denn folgendes bei dir:

Code: Alles auswählen

import sys
print sys.stdout.encoding

Re: Eurozeichen ausgeben?

Verfasst: Dienstag 31. Mai 2016, 01:11
von Yadgar
Hi(gh)!
snafu hat geschrieben: Was sagt denn folgendes bei dir:

Code: Alles auswählen

import sys
print sys.stdout.encoding
Die Ausgabe lautet "UTF-8"!

Bis bald im Khyberspace!

Yadgar

Re: Eurozeichen ausgeben?

Verfasst: Dienstag 31. Mai 2016, 05:16
von Sirius3
@Yadgar: Du gibts keinen String mit Eurozeichen aus, sondern eine Liste mit Strings von Eurozeichen. Die Liste wird in Python immer in einer Debug-Ausgabe ausgegeben, in der Sonderzeichen durch ihre Escapezeichen dargestellt werden, damit es z.B. bei Binärdaten zu keinem Kauderwelsch kommt.

Re: Eurozeichen ausgeben?

Verfasst: Dienstag 31. Mai 2016, 07:42
von Sirius3
@Yadgar: noch ein paar allgemeine Anmerkungen zum Code: Einrückung ist per Konvention immer 4 Leerzeichen pro Ebene, nicht 2. Du hast zudem noch Tabs mit Leerzeichen gemischt. Das solltest Du auf keinen Fall machen. Stelle Deinen Editor am besten so ein, dass beim Drücken der Tabtaste 4 Leerzeichen und nie Tabzeichen ausgegeben werden. Die Schreibweise von Variablennamen ist klein_mit_unterstrich.

Zeile 5: in Python2 sollte immer raw_input verwendet werden.
Zeile 6: falsche Variablennamen sind viel schlimmer als nichtssagende. Hier und im Folgenden sollte dem Leser eindeutig klar sein, dass es sich um euro_cent und nicht um euro handelt.
Zeile 7: »anzahl« wird nie verwendet.
Zeile 12: statt einer while-Schleife solltest Du hier eine for-Schleife benutzen. Am besten iterierst Du gleich über »einheiten«.
Zeile 13: Da Du Ganzzahl-Division mit Ganzzahlen machst, ist ein explizites Umwandeln in int unnötig.
Zeile 23: wieder ein falscher Variablenname. »muenze« kann sowohl ein Schein als auch eine Münze sein. Statt hier alles gleich in Strings zu verwandeln, würde ich alle Münz/Schein-Anzahlen in als Zahl eine Liste packen, dann kann ich nachträglich auch einfach durch Summenbildung prüfen, ob ich richtig gerechnet habe. Auch anzahlScheine oder anzahlMuenzen brauchst Du dann nicht extra zu zählen. Unicode-Zeichen solltest Du in Unicode-Strings schreiben: »u"€"«, bzw. »u"¢"«.
Zeile 32: print ist keine Funktion, braucht daher auch keine Klammern
Zeile 34/38: wie schon im vorherigen Post geschrieben ist die Stringausgabe einer Liste nur für Debugzwecke da. Am einfachsten Wandelst Du die Liste per »join« in einen String.

Code: Alles auswählen

#-*- coding: utf-8 -*-
SCHEINE = [50000, 20000, 10000, 5000, 2000, 1000, 500]
MUENZEN = [200, 100, 50, 20, 10, 5, 2, 1]

def stueckelung2string(stueckelung, einheiten):
    ergebnis = []
    for anzahl, einheit in zip(stueckelung, einheiten):
        if anzahl > 0:
            if einheit >= 100:
                zeichen = u'{}€'.format(einheit//100)
            else:
                zeichen = u'{}¢'.format(einheit)
            ergebnis.append(u'{} x {}'.format(anzahl, zeichen))
    return ', '.join(ergebnis)


def main():
    euro = float(raw_input("Bitte einen Euro-Betrag eingeben!"))
    euro_cent = int(euro * 100)

    stueckelung = []
    for einheit in SCHEINE + MUENZEN:
        anzahl, euro_cent = divmod(euro_cent, einheit)
        stueckelung.append(anzahl)

    anzahl_scheine = sum(stueckelung[:len(SCHEINE)])
    anzahl_muenzen = sum(stueckelung[len(SCHEINE):])

    print "Man braucht mindestens"
    if anzahl_scheine > 0:
        print u"{} Scheine: {}".format(
            anzahl_scheine,
            stueckelung2string(stueckelung[:len(SCHEINE)], SCHEINE)
        )
    if anzahl_scheine > 0 and anzahl_muenzen > 0:
        print "und"   
    if anzahl_muenzen > 0:
        print u"{} Münzen: {}".format(
            anzahl_scheine,
            stueckelung2string(stueckelung[len(SCHEINE):], MUENZEN)
        )

if __name__ == '__main__':
    main()