3. StructureUnion und Euro in Cent umwandeln
Verfasst: 08.05.2008 21:54
Hiermal ein weiteres kleines Beispiel mit StructureUnion
Unstrittig ist sicher das man mit Ganzzahlen schneller rechnen kann. Dazu muß man aber die Euro Beträge aus einer Liste in Cent umwandeln. Wir gehen davon aus, das die Beträge in der Liste maximal 2 Stellen haben.
Dafür gibt es eine sehr simple und einfache Methode siehe unten im Code die Procedure UsingCent(euro$).
Nur leider ist es nicht die schnellste Methode und bei etwas größeren Listen mit mehreren Einträgen pro Zeile, da zählt jeder Bruchteil einer Sekunde.
Die Procedure UsingCent2(*z.Zahlenformat1) ist bei mir 2-3 mal so schnell.
Es ist kaum zu glauben, erheblich mehr Code, aber schneller.
Unstrittig ist sicher das man mit Ganzzahlen schneller rechnen kann. Dazu muß man aber die Euro Beträge aus einer Liste in Cent umwandeln. Wir gehen davon aus, das die Beträge in der Liste maximal 2 Stellen haben.
Dafür gibt es eine sehr simple und einfache Methode siehe unten im Code die Procedure UsingCent(euro$).
Nur leider ist es nicht die schnellste Methode und bei etwas größeren Listen mit mehreren Einträgen pro Zeile, da zählt jeder Bruchteil einer Sekunde.
Die Procedure UsingCent2(*z.Zahlenformat1) ist bei mir 2-3 mal so schnell.
Es ist kaum zu glauben, erheblich mehr Code, aber schneller.
Code: Alles auswählen
;Vergleich von 2 Prozeduren die Euro Beträge die als String vorliegen in Cent umwandeln
;HJBremer Mai 2008
Structure Zahlenformat1
StructureUnion
s.s{15} ;Größe des Fixstring von 15 individuell anpassen falls nötig
c.c[0]
EndStructureUnion
EndStructure
Procedure UsingCent(euro$)
;normaler Weg
ReplaceString(euro$,",",".",2) ; komma durch punkt ersetzen im Original
wert=ValF(euro$)*100
ProcedureReturn wert
EndProcedure
Procedure UsingCent2(*z.Zahlenformat1)
;mit StructureUnion
Protected null = '0'
Protected punkt = '.'
Protected komma = ','
Protected maxlg = SizeOf(Zahlenformat1) ;
Protected max = maxlg - 1 ;warum maxlg-1, siehe PB Hilfe Strukturen
Protected j ;Schleifenvariable
;letztes Komma wird Punkt
If CountString(*z\s, ",")
;ersetzt *z\s = ReplaceString(*z\s, ",", ".") allerdings nur das letzte Komma
For j = max To 0 Step -1
If *z\c[j] = komma
*z\c[j] = punkt
Break
EndIf
Next
EndIf
If CountString(*z\s, ".")
;wo ist der Punkt ?
For j = 0 To max
If *z\c[j] = punkt
;Zahl mit Punkt ohne Kommastellen
If *z\c[j+1] = 0
*z\c[j] = null
*z\c[j+1] = null
;Zahl mit Punkt und 1 Kommastelle
ElseIf *z\c[j+2] = 0
*z\c[j] = *z\c[j+1]
*z\c[j+1] = null
;Zahl mit Punkt und 2 Kommastellen
Else
*z\c[j] = *z\c[j+1]
*z\c[j+1] = *z\c[j+2]
*z\c[j+2] = 0
EndIf
Break
EndIf
Next
Else
;kein Punkt, 2 Nullen anhängen
For j = 0 To max
If *z\c[j] = 0
*z\c[j] = null
*z\c[j+1] = null
Break
EndIf
Next
EndIf
ProcedureReturn Val(*z\s)
EndProcedure
;Demo=================================================
Debug UsingCent("123")
Debug UsingCent("123,")
Debug UsingCent("123,4")
Debug UsingCent("123,45")
Debug "---"
z.Zahlenformat1
z\s = "123"
Debug UsingCent2(z)
z\s = "123,"
Debug UsingCent2(z)
z\s = "123,4"
Debug UsingCent2(z)
z\s = "123,45"
Debug UsingCent2(z)
;Speedtest=Debugger ausschalten========================
max = 100000
a=GetTickCount_()
For j = 1 To max
euro$ = "123,45"
cent = UsingCent(euro$)
Next
b=GetTickCount_()-a
a=GetTickCount_()
For j = 1 To max
z\s = "123,45"
cent2 = UsingCent2(z)
Next
c=GetTickCount_()-a
MessageRequester("",Str(cent)+"="+Str(b)+#LF$+Str(cent2)+"="+Str(c))