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. :cry: