Ersatz für ReplaceString, z.B. bei Zahlen Komma wird Punkt

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.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Ersatz für ReplaceString, z.B. bei Zahlen Komma wird Punkt

Beitrag von hjbremer »

Sehr oft kommt es vor, das man bei Zahlen das Komma durch einen Punkt ersetzen muß.
In der Regel nimmt man dazu ReplaceString.
Für bestimmte Anwendungen könnte es sich aber zeitlich lohnen eine schnellere Variante zu benutzen.

Hier mal eigene Varianten im Vergleich zur schnellsten ReplaceString Methode.

Debugger ausschalten !!!

Code: Alles auswählen

Structure Format1
  StructureUnion
    s.s{20}
    c.c[0]
  EndStructureUnion
EndStructure    

Procedure myReplace(*x.Format1)

    For i = 0 To SizeOf(Format1)-1
    
      If *x\c[i] = 44  ;komma
         *x\c[i] = 46  ;punkt
         Break
      EndIf
    
    Next
    
EndProcedure

Procedure myReplace1(*x.Format1, such, ersatz)

    For i = 0 To SizeOf(Format1)-1
    
      If *x\c[i] = such
         *x\c[i] = ersatz
      EndIf
    
    Next
    
EndProcedure

Procedure.s myReplace2(*x.Format1, such, ersatz)

    For i = 0 To SizeOf(Format1)-1
    
      If *x\c[i] = such
         *x\c[i] = ersatz
      EndIf
    
    Next
    
ProcedureReturn *x\s    
  
EndProcedure

;==========================

z.Format1

max = 500000

;==========================

a=GetTickCount_()

For j = 1 To max
    z\s = "12345,78"
    For i = 0 To SizeOf(Format1)-1
      If z\c[i] = 44  ;komma
         z\c[i] = 46  ;punkt
         Break
      EndIf
    Next
Next

Debug RSet(z\s,SizeOf(Format1))

o=GetTickCount_()-a

;==========================

a=GetTickCount_()

For j = 1 To max
    z\s = "12345,78"
    myReplace(z)
Next

Debug RSet(z\s,SizeOf(Format1))

q=GetTickCount_()-a

;==========================

a=GetTickCount_()

For j = 1 To max
    z\s = "12345,78"
    myReplace1(z, ',', '.')
Next

Debug RSet(z\s,SizeOf(Format1))

b=GetTickCount_()-a

;==========================

a=GetTickCount_()

For j = 1 To max
    z\s = "12345,78"
    z\s = myReplace2(z, ',', '.')
Next

Debug RSet(z\s,SizeOf(Format1))

c=GetTickCount_()-a

;==========================

a=GetTickCount_()

For j = 1 To max
    x$ = "12345,78"
    ReplaceString(x$, ",", ".", 2)
Next

Debug RSet(x$,SizeOf(Format1))

d=GetTickCount_()-a
MessageRequester("",Str(o)+#LF$+Str(q)+#LF$+Str(b)+#LF$+Str(c)+#LF$+Str(d))

PS: Das Prinzip kann man natürlich auch für andere Strings benutzen. Bis zu einem Fixstring von ca 100 Zeichen ist es schneller, darüber muß man probieren.

PS: Das Prinzip funktioniert auch mit CountString
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
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

Hi HjBremer,

hast schon einen Vergleich mit der neuen beta-lib probiert?

http://www.purebasic.fr/english/viewtopic.php?t=32400

lg
Marco
Windows 11 - PB 6.03 x64
_________________________________
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Re: Ersatz für ReplaceString, z.B. bei Zahlen Komma wird Pun

Beitrag von AND51 »

hjbremer hat geschrieben:das man bei Zahlen das Komma durch einen Punkt ersetzen muß
Jo und sobald man das Komma gefunden und ersetzt hat, könnte man auch aus Versehen Break benutzen, damit man noch mehr Zeit spart. :wink:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten