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
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
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
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
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
Anmeldungsdatum: 19. März 2007
Beiträge: 383
|
Sag ich doch ☺ Gruß FatFire P.S.: Ich markiere mal als gelöst.
|
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
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
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
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
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
Anmeldungsdatum: 19. März 2007
Beiträge: 383
|
Ich hasse Tausendertrennzeichen 🙄 😉 Gruß FatFire
|