ubuntuusers.de

Meine erste Frage in Programmieren :) (Python)

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

w3bmaster

Anmeldungsdatum:
26. September 2007

Beiträge: 231

Ich habe ja mittlerweile mit Python angefangen und versuche schon die ersten Hello World's zu schreiben.

Ich versuche ein Rechner zu schreiben der mir mein Benzinverbrauch berechnen soll und das Problem ist wenn ich die eingegebene Preise Bsp. 1,33 via float(wert) in gleitzahl umwandeln will dann bekomme ich Fehlermeldung ich wüsste nicht wie ich die eingegebene Werte berechnen lassen konnte.

Fredo Team-Icon

Avatar von Fredo

Anmeldungsdatum:
27. Juni 2005

Beiträge: 5244

Wohnort: Bochum

Hm, poste doch bitte mal genau den relevanten Teil Deines Codes und den Trackback. Dann kann man da vielleicht mehr sagen.

Liebe Grüße
Fredo

FatFrog

Avatar von FatFrog

Anmeldungsdatum:
19. März 2007

Beiträge: 383

Ohne korrekte Fehlermeldung ist das im Trüben fischen, aber mein Tip: Versuch doch einfach mal 1.33 statt 1,33 einzugeben, denn in allen (mir bekannten) Programmiersprachen ist der Punkt das Dezimaltrennzeichen, nicht das Komma.

Gruß FatFire

w3bmaster

(Themenstarter)

Anmeldungsdatum:
26. September 2007

Beiträge: 231

Fredo hat geschrieben:

Hm, poste doch bitte mal genau den relevanten Teil Deines Codes und den Trackback. Dann kann man da vielleicht mehr sagen.

Liebe Grüße
Fredo

Hab's ohne Hilfe vom Buch geschrieben und hoffe, dass ich es soweit richtig geschrieben habe. Hab nämlich das Alte gelöscht, weil ich Sauer war.

Bsp.
aktuell = raw_input("Aktuelle benzinpreise?")
gefahren = raw_input("Gefahrene Kilometer")
verbrauch = raw_input("Verbrauch auf 100 Km")

#hier sollen die eingegebene werte dann als kommazahlen umgewandelt werden,

aktuell2 = float(aktuell)
gefahren2 = float(gefahren)
verbrauch2 = float(verbrauch)

#hier dann die berechnung und ausgabe

wert3 = gefahren2 / 100
wert4 = wert3 * verbrauch2
ausgabe = wert4 * aktuell2

print ausgabe

es kommt aber zur fehlermeldung

ValueError: invalid literal for float(): 1,319

Fredo Team-Icon

Avatar von Fredo

Anmeldungsdatum:
27. Juni 2005

Beiträge: 5244

Wohnort: Bochum

FatFire hat geschrieben:

Ohne korrekte Fehlermeldung ist das im Trüben fischen, aber mein Tip: Versuch doch einfach mal 1.33 statt 1,33 einzugeben, denn in allen (mir bekannten) Programmiersprachen ist der Punkt das Dezimaltrennzeichen, nicht das Komma.

He, das ist natürlich mal eine Idee... ☺

@w3bmaster: Wenn Du von User-Input abhängst, bei dem das Komma als Dezimalzeichen benutzt wird, solltest Du Dir mal das Modul locale angucken:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'de_DE.UTF-8'
>>> locale.atof('1,33')
1.3300000000000001

Liebe Grüße
Fredo

w3bmaster

(Themenstarter)

Anmeldungsdatum:
26. September 2007

Beiträge: 231

Wenn Mann es mit Punkt macht also sagen wir "1.33" dann klappt es, aber mit'n Komma klappt es nicht, und das Problem ist ja bei eine normale Tastatur ist Komma immer neben 0

FatFrog

Avatar von FatFrog

Anmeldungsdatum:
19. März 2007

Beiträge: 383

Entweder mal das befolgen, wie Fredo geschrieben, oder etwas dirty, aber genauso wirkungsvoll statt

aktuell2 = float(aktuell)
gefahren2 = float(gefahren)
verbrauch2 = float(verbrauch)


einfach

aktuell2 = float(aktuell.replace(",","."))
gefahren2 = float(gefahren.replace(",","."))
verbrauch2 = float(verbrauch.replace(",","."))


schreiben. Dann tauscht er ein eventuell vorhandenes Komma gegen einen Punkt aus und kann nach Float konvertieren.

Gruß FatFire

w3bmaster

(Themenstarter)

Anmeldungsdatum:
26. September 2007

Beiträge: 231

Es hat funktioniert ☺

# -*- coding: utf-8 -*-
aktuell = raw_input("Aktuelle Benzinpreis? ")
gefahren = raw_input("Zu Fahrende Kilometer? ")
verbrauch = raw_input("Verbrauch auf 100 Km? ")



aktuell2 = float(aktuell.replace (",","."))
gefahren2 = float(gefahren.replace (",","."))
verbrauch2 = float(verbrauch.replace (",","."))


wert3 = gefahren2 / 100
wert4 = wert3 * verbrauch2
ausgabe = wert4 * aktuell2

print "Sie werden für die Fahrt ", ausgabe , "€ verbrennen :)"

Vielen Dank

FatFrog

Avatar von FatFrog

Anmeldungsdatum:
19. März 2007

Beiträge: 383

Sag ich doch ☺

Gruß FatFire

P.S.: Ich markiere mal als gelöst.

Fredo Team-Icon

Avatar von Fredo

Anmeldungsdatum:
27. Juni 2005

Beiträge: 5244

Wohnort: Bochum

Hm, ich will ja nicht meckern. Und natürlich funktioniert es so. Aber warum nicht gleich ordentlich? Mal angenommen, das Programm wäre nicht nur für Deinen Privatgebrauch, sondern soll irgendwann einmal einer breiteren Öffentlichkeit zur Verfügung stehen. Und diese Öffentlichkeit kommt nicht nur aus Deutschland, sondern auch aus anderen Ländern, die andere Konventionen für Dezimalzahlen haben. Warum dann nicht gleich die saubere (und meiner Meinung nach keineswegs kompliziertere) Lösung verwenden?

# -*- coding: utf-8 -*- 
import locale
locale.setlocale(locale.LC_ALL, '')

aktuell = raw_input("Aktuelle Benzinpreis? ") 
gefahren = raw_input("Zu Fahrende Kilometer? ") 
verbrauch = raw_input("Verbrauch auf 100 Km? ") 

aktuell2 = locale.atof(aktuell)
gefahren2 = locale.atof(gefahren)
verbrauch2 = locale.atof(verbrauch)

wert3 = gefahren2 / 100 
wert4 = wert3 * verbrauch2 
ausgabe = wert4 * aktuell2 

print "Sie werden für die Fahrt %s verbrennen :)" % locale.currency(ausgabe)

Liebe Grüße
Fredo

FatFrog

Avatar von FatFrog

Anmeldungsdatum:
19. März 2007

Beiträge: 383

Tja, natürlich mag es wesentlich sauberer sein und auf den ersten Blick auch besser.
Aber:
1. Unnötig, es gibt als Dezimaltrennzeichen heutzutage nur noch Punkt oder Komma und mit allen anderen Konventionen würde man mit Python sowieso auf die Schnauze fallen
2. Die Öffentlichkeit kommt nicht nur aus Deutschland, stimmt. Und gar nicht mal weit weg ist die Schweiz, wo es durchaus üblich ist, das Komma als Dezimaltrennzeichen zu nutzen...ausser bei Geldbeträgen die generell mit Punkt geschrieben werden. Also würden dort die gefahrenen Kilometer und der Verbrauch mit Komma, der Preis pro Liter allerdings mit Punkt geschrieben werden. Wird das auch durch locale.atof(wert) berücksichtigt?

Gruß FatFire

P.S.: Glückwunsch zum 3000sten, Fredo. ☺

Fredo Team-Icon

Avatar von Fredo

Anmeldungsdatum:
27. Juni 2005

Beiträge: 5244

Wohnort: Bochum

FatFire hat geschrieben:

Aber:
1. Unnötig, es gibt als Dezimaltrennzeichen heutzutage nur noch Punkt oder Komma und mit allen anderen Konventionen würde man mit Python sowieso auf die Schnauze fallen

Ja, das stimmt. Praktisch finde ich es aber z.B. bei der Währungsausgabe. Wobei man da natürlich auch immer davon ausgeht, dass auch die Standardwährung des Landes benutzt wird. Man braucht aber das "€" nicht hardzucoden, sondern kann das gleiche Programm in der Schweiz benutzen, wo davon ausgegangen wird, dass alle Beträge in Fr. sind.

FatFire hat geschrieben:

2. Die Öffentlichkeit kommt nicht nur aus Deutschland, stimmt. Und gar nicht mal weit weg ist die Schweiz, wo es durchaus üblich ist, das Komma als Dezimaltrennzeichen zu nutzen...ausser bei Geldbeträgen die generell mit Punkt geschrieben werden. Also würden dort die gefahrenen Kilometer und der Verbrauch mit Komma, der Preis pro Liter allerdings mit Punkt geschrieben werden. Wird das auch durch locale.atof(wert) berücksichtigt?

Das ist ein interessanter Fall. Für de_CH nimmt locale in beiden Fällen den Punkt als Dezimaltrenner an. Allerdings gibt es einen Unterschied zwischen decimal_point und mon_decimal_point, es ist also prinzipiell möglich, auch hier eine Unterscheidung zu treffen. Jetzt kenne ich mich aber mit der Schweiz nicht so weit aus, was hier das korrektere Verhalten wäre.

FatFire hat geschrieben:

P.S.: Glückwunsch zum 3000sten, Fredo. ☺

Oh, danke! Hatte ich gar nicht gesehen... ☺

Liebe Grüße
Fredo

FatFrog

Avatar von FatFrog

Anmeldungsdatum:
19. März 2007

Beiträge: 383

Könnte man sich vielleicht darauf einigen, dass es beim Einlesen schon okay ist mit meinem Ansatz (weil er sowohl Punkt als auch Komma schlucken würde), dafür aber bei der Ausgabe natürlich mit den von Dir genannten Vorteilen besser locale zu nutzen?

Gruß FatFire

Fredo Team-Icon

Avatar von Fredo

Anmeldungsdatum:
27. Juni 2005

Beiträge: 5244

Wohnort: Bochum

FatFire hat geschrieben:

Könnte man sich vielleicht darauf einigen, dass es beim Einlesen schon okay ist mit meinem Ansatz (weil er sowohl Punkt als auch Komma schlucken würde), dafür aber bei der Ausgabe natürlich mit den von Dir genannten Vorteilen besser locale zu nutzen?

Ich denke, man kann sich einfach darauf einigen, dass man seine Optionen und die damit verbundenen Probleme und Möglichkeiten kennen sollte. Ich gebe Dir völlig recht, dass die replace-Methode toleranter ist und man so z.B. mehrere Dezimaltrenner erfassen kann. Und für einige Fälle ist das vermutlich sinnvoller (z.B. wenn die Schweizer gar nicht einheitlich . oder , benutzen). Für diesen Fall taugt es daher wohl auch am besten.

Aber es gibt auch Grenzen, die man einfach kennen muss:

>>> locale.atof('1.000.000,40')
1000000.4
>>> float('1.000.000,40'.replace(',', '.'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): 1.000.000.40

Es gibt eben selten eine beste Lösung... 😉

Liebe Grüße
Fredo

FatFrog

Avatar von FatFrog

Anmeldungsdatum:
19. März 2007

Beiträge: 383

Ich hasse Tausendertrennzeichen 🙄

😉

Gruß FatFire

Antworten |