Werte aus Listicon addieren

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Fox
Beiträge: 75
Registriert: 08.08.2007 10:14
Kontaktdaten:

Werte aus Listicon addieren

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Werte aus Listicon addieren

Beitrag 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)
bizzl
Beiträge: 82
Registriert: 08.09.2005 18:07
Computerausstattung: AMD Athlon II X4 635
Windows 7 64 Bit
Wohnort: Nordhessen - früher : Südniedersachsen

Re: Werte aus Listicon addieren

Beitrag 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.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Werte aus Listicon addieren

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Fox
Beiträge: 75
Registriert: 08.08.2007 10:14
Kontaktdaten:

Re: Werte aus Listicon addieren

Beitrag 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.
bizzl
Beiträge: 82
Registriert: 08.09.2005 18:07
Computerausstattung: AMD Athlon II X4 635
Windows 7 64 Bit
Wohnort: Nordhessen - früher : Südniedersachsen

Re: Werte aus Listicon addieren

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Werte aus Listicon addieren

Beitrag 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€")
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Werte aus Listicon addieren

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Werte aus Listicon addieren

Beitrag von RSBasic »

+1
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

Re: Werte aus Listicon addieren

Beitrag von Tommy »

@ Fox : Deine Seite geht nich. :cry:
PB 5.41 x64
Antworten