Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Für alle die Euro-Beträge aus einer Liste mit formatierten Zahlen in Cent umwandeln müssen um dann mit Ganzzahlen weiterrechnen wollen.
Es wird vorausgesetzt, das jede Zahl 2 Kommastellen hat.
Hier meine Miniversion im Vergleich zu 3 anderen Standardversionen.
Fällt jemandem etwas schnelleres ein, so möge er mir dies unbedingt mitteilen, denn ich muß meine Liste mit über 5000 Zeilen häufig neu berechnen. Ich habe die Daten aber nicht in Feldern zusätzlich abgelegt. Ist mir zu aufwändig.
Procedure uc(euro$)
ProcedureReturn ValF(euro$)*100
EndProcedure
Procedure uc0(euro$)
ProcedureReturn Val(ReplaceString(euro$,".","",1))
EndProcedure
Procedure uc1(euro$)
ProcedureReturn Val(RemoveString(euro$,".",1))
EndProcedure
Procedure uc2(euro$)
*z = @euro$
lg = Len(euro$) -3
CopyMemory(*z,*z+1,lg)
PokeC(*z,' ')
ProcedureReturn Val(euro$)
EndProcedure
;Test ohne Debugger !!!
max = 100000
a=GetTickCount_()
For j = 1 To max
cent = uc("61023.45")
Next
b=GetTickCount_()-a
a=GetTickCount_()
For j = 1 To max
cent0 = uc0("61023.45")
Next
c=GetTickCount_()-a
a=GetTickCount_()
For j = 1 To max
cent1 = uc1("61023.45")
Next
d=GetTickCount_()-a
a=GetTickCount_()
For j = 1 To max
cent2 = uc2("61023.45")
Next
e=GetTickCount_()-a
MessageRequester("",Str(cent)+" Normal ="+Str(b)+#LF$+Str(cent0)+" Replace ="+Str(c)+#LF$+Str(cent1)+" Remove ="+Str(d)+#LF$+Str(cent2)+" Memory ="+Str(e))
Purebasic 5.70 x86 5.72 X 64 - Windows 10
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Kleine Beschreibung wäre zu jeder Prozedur angebracht; du musst außerdem auch vernünftige namen für die prozeduren vergeben. Durch kürze Prozedurnamen wird deine Prozedur sowieso nicht schneller und "zu viel zu tippen" gibt's auch nicht als Ausrede, da das Autovervollständigen schon erfunden wurde.
Ich arbeite gerade an Verbesserungen und werde gleich Posten.
Bin sicher, da kann man noch was rausholen.
Schimpfen muss ich auch:
uc0() - Wozu gibt's da RemoveString(), um etwas zu entfernen?
// Edit:
> Ist mir zu aufwändig
Du liest einen Betrag als String aus der Liste, konvertierst sie zum Rechnen in eine Zahl und dann hinterher wieder zurück in einen String? Performance, leb wohl...
Aber GetGadgetItemData() nicht, wenn du das Data Feld mitbenutzen würdest, sofern möglich.
Nix Beschreibung, jetzt hab ich verstanden: ALLE Prozeduren wandeln in Cent um und du willst die schnellste. Jetzt verstehe ich auch den Unterschied zwischen uc0 ohne und uc1 mit RemoveString.
Sorry, das habe ich jetzt erst verstanden. Eine Prozedur habe ich schon fertig, ca. 8x schneller als uc0. Tüftle noch.
Übrigens: Deine letzte Prozedur funzt nicht... Du verschiebst alle zeichen im Buffer 1 nach rechts?
3 Fehler:
1. Die Speicherbereiche überlappen sich - MoveMemory() ist hier sicherer, wenn auch langsamer
2. Du verschiebst alle Zeichen um 1 nach rechts OHNE den Speicher zu re-allokieren (ReAllocateMemory()); BÖÖÖSE
3. Du setzt vor die ganze Zahl ein Leerzeichen? Wozu, damit Val() immer 0 zurückgibt?
Ich denke noch schneller wird man nur noch mit Assembler Befehlen. Ein Schwachpunkt ist MemoryStringLength. Ich kenn mich damit leider nicht aus, aber es gibt doch den Befehl _strstr. Gibt es nicht vielleicht sowas wie _strlen ?
Purebasic 5.70 x86 5.72 X 64 - Windows 10
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Irre ich mich, oder hast du bei meiner Prozedur im Prinzip nur das Val() + das Return ausgegliedert?
P.S.: Deine 2. Version ist soweit ich das sehe, vom Prinzip her ähnlich wie meine, oder?
MemoryStringLength ist schon okay, die Alternative wäre StringByteLength, aber letzteres arbeitet ohne Pointer und ist daher hier ungeeignet.
P.S.: Deine 2. Version funktioniert nur im ASCII-Modus, sie wird in Unicode nicht funktionieren. statt in der ersten Zeile -1 zu rechnen, nimm lieber -SIzeOf(Character)
edel, du hättest nur dann Recht, wenn hjbremer hier —wie immer in der Code-Tipps-Tricks-Ecke— einen Universalcode veröffentlichen würde.
Der Code hat sehr wohl einen Nutzen, schon mal die "Aufgabenstellung" gelesen? Wohl kaum!
Er sucht hier nach einer möglichst schnellen Prozedur für genau sein Problem: Eine Liste mit String-basierten Eurowerten, die immer 2 Nachkommastellen haben, in Cent umzuwandeln.
Die hier geposteten Codes dürften also nur exakt auf sein Problem zutreffen.
Natürlich hat er in das falsche Subforum gepostet. Aber da kein Mod den Thread hier mal nach Allgemein verschoben hat und du auch noch nach dem nicht vorhandenen allgemeinen Nutzen fragst, kann man davon ausgehen,
dass niemand außer mir sich diesen Thread durchgelesen hat.
AND51 hat geschrieben:bla, bla bla bla bla bla, bla bla bla —bla bla bla bla bla-bla-bla-bla— bla bla bla bla.
bla bla bla bla bla bla bla, bla bla bla "bla" bla? bla bla!
bla bla bla bla bla bla bla bla bla bla bla bla: bla bla bla bla-bla bla, bla bla bla bla bla, bla bla bla.
bla bla bla bla bla bla bla bla bla bla bla bla.
bla bla bla bla bla bla bla bla. bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla, bla bla bla bla,
bla bla bla bla bla bla bla bla bla.
Bitte?
Naja, da kann man ja nur hoffen das wenigstens du verstehst, was da steht.