Seite 1 von 2
Werte aus Listicon addieren
Verfasst: 13.05.2015 21:06
von Fox
Hallo PureBoard Community,
ich habe eine bescheidene Frage, welche per se wirklich einfach scheint, aber ich sitze nun schon seit 2 Stunden auf dem Schlauch. Folgendes Problem: Ich hab ein ListIconGadget in der ich Elemente der Anzahl n habe. Die Anzahl bestimme ich, lese dann alle Werte aus und möchte diese nun gerne addieren, was ja eigentlich nicht so schwer sein sollte. Habe schon lange nichts mehr mit PB gemacht, weswegen ich entsprechend "raus" bin und wieder reinkommen möchte.
Code: Alles auswählen
Case #Button_Enter
zaehlung = CountGadgetItems(#ListIcon_Bill) ;Maxium der Items, d.h. Zaehlung bis zum Ende der Liste
For cd = 0 To zaehlung ;cd = 0 ist Anfang, ergo von Anfang bis Ende zählen
Debug GetGadgetItemText(#ListIcon_Bill, cd, 1) ;Ausgeben der Werte
Next
Die ausgegebenen Werte haben folgendes Format:
7,00€
5,50€
1,40€
Erbarmt sich jemand und kann mir da mal wieder auf die Sprünge helfen?
Gruß,
Fox
Re: Werte aus Listicon addieren
Verfasst: 13.05.2015 21:31
von NicTheQuick
Mit Euro2Cent kannst du zunächst die Euro-Werte in Cent umrechnen. Dann addierst du alle zusammen und rechnest am Ende die Cents wieder mit Cent2Euro zurück.
Code: Alles auswählen
Procedure.i Euro2Cent(euro.s)
euro = ReplaceString(euro, ",", ".")
Protected d.d = ValD(euro)
ProcedureReturn d * 100
EndProcedure
Procedure.s Cent2Euro(cent.i)
If cent < 100
ProcedureReturn "0," + RSet(Str(cent), 2, "0") + "€"
Else
ProcedureReturn Str(cent / 100) + "," + RSet(Str(cent % 100), 2, "0") + "€"
EndIf
EndProcedure
Define cents.i = Euro2Cent("7,00€")
cents + Euro2Cent("5,50€")
cents + Euro2Cent("1,40€")
Debug Cent2Euro(cents)
Re: Werte aus Listicon addieren
Verfasst: 13.05.2015 21:37
von bizzl
Hallo,
ich würde es so machen:
Code: Alles auswählen
Define item$,wert.f,summe.f
For cd = 0 To zaehlung ;cd = 0 ist Anfang, ergo von Anfang bis Ende zählen
item$=GetGadgetItemText(#ListIcon_Bill, cd, 1)
;Nun die Kommas in Punkte ändern:
item$=ReplaceString(item$,",",".")
;in Fließkommazahl umwandeln - das Euro-Symbol stört nicht, da es am Ende steht
wert=ValF(item$)
;und addieren
summe=summe+wert
Next
Debug summe
NicTheQuick war schneller.
Re: Werte aus Listicon addieren
Verfasst: 13.05.2015 21:44
von RSBasic
Fox hat geschrieben:Code: Alles auswählen
zaehlung = CountGadgetItems(#ListIcon_Bill) ;Maxium der Items, d.h. Zaehlung bis zum Ende der Liste
For cd = 0 To zaehlung ;cd = 0 ist Anfang, ergo von Anfang bis Ende zählen
Zusatztipp: Da du in der Schleife schon bei 0 anfängst, musst du deine Anzahlvariable natürlich noch mit 1 subtrahieren.
Re: Werte aus Listicon addieren
Verfasst: 13.05.2015 22:01
von Fox
Danke euch für die schnelle Hilfe. Anscheinend mach ich irgendwas falsch. Sowohl bei der Variante von NicTheQuick als auch bei der von bizzl kommen seltsame Werte zustande.
Im 1. Fall sind sie immer zu groß und im 2. Fall sehr klein. Bei einem Betrag von 1,40 und 5,50 bekomme ich 1.3999 raus.
Re: Werte aus Listicon addieren
Verfasst: 13.05.2015 22:14
von bizzl
Hallo Fox,
ich habe deine beiden Werte in Datazeilen gepackt zum testen:
Code: Alles auswählen
Define item$,wert.f,summe.f
For cd = 0 To 1 ;cd = 0 ist Anfang, ergo von Anfang bis Ende zählen
;item$=GetGadgetItemText(#ListIcon_Bill, cd, 1)
Read.s item$
;Nun die Kommas in Punkte ändern:
item$=ReplaceString(item$,",",".")
;in Fließkommazahl umwandeln - das Euro-Symbol stört nicht, da es am Ende steht
wert=ValF(item$)
;und addieren
summe=summe+wert
Next
Debug summe
Debug StrF(summe,2)
DataSection
Data.s "1,40 Euro","5,50 Euro"
EndDataSection
Heraus kommt 6.90000009536743 bzw. bei StrF(summe,2) kommt 6.90 heraus.
Wegen der Ungenauigkeit(6.90000...) siehe bitte in der Hilfe nach unter
"Variablen, Typen und Operatoren", letzter Absatz.
Re: Werte aus Listicon addieren
Verfasst: 13.05.2015 22:22
von NicTheQuick
Das liegt wiederum an der Ungenauigkeit von Fließkommazahlen, die man für Geldbeträge nie nutzen sollte. Da werden nämlich, wie du schon bemerkt hast, aus 1,40 € ganz schnell mal 1,39999... €
Wenn man gänzlich ohne Fließkommaarithmetik auskommen will, kann man es z.B. so machen.
Code: Alles auswählen
Procedure.i Euro2Cent(euro.s)
Protected i.i = FindString(euro, ",")
If (i = 0)
ProcedureReturn Val(euro)
Else
Protected cents.i = Val(Mid(euro, i + 1, 2))
If (Mid(euro, i + 1, 1) = "0")
ProcedureReturn Val(Left(euro, i)) * 100 + cents
Else
ProcedureReturn Val(Left(euro, i)) * 100 + cents * 10
EndIf
EndIf
EndProcedure
Procedure.s Cent2Euro(cent.i)
If cent < 100
ProcedureReturn "0," + RSet(Str(cent), 2, "0") + "€"
Else
ProcedureReturn Str(cent / 100) + "," + RSet(Str(cent % 100), 2, "0") + "€"
EndIf
EndProcedure
Define cents.i = Euro2Cent("7,00€")
cents + Euro2Cent("5,50€")
cents + Euro2Cent("1,4€")
Debug Cent2Euro(cents)
Debug Euro2Cent("7,00€")
Debug Euro2Cent("5,50€")
Debug Euro2Cent("1,4€")
Re: Werte aus Listicon addieren
Verfasst: 13.05.2015 22:25
von STARGÅTE
Bei Geldbeträge bitte immer mit Ganzzahl-Typen rechnen, also in Cent!
Die Darstellungsform und Eigenschaften von Fließkommazahlen ist für Geldbeträge nicht geeignet!
Das trift nicht nur auf PureBasic zu, sondern auch in Programmen wie Excel und co.
Re: Werte aus Listicon addieren
Verfasst: 13.05.2015 22:27
von RSBasic
+1
Re: Werte aus Listicon addieren
Verfasst: 13.05.2015 22:45
von Tommy
@ Fox : Deine Seite geht nich.
