Seite 1 von 7

Tausendertrennzeichen für (große) Zahlen

Verfasst: 17.11.2006 21:18
von AND51
Hallo!

Obwohl ich die Prozedur für den Eigenbedarf erstellt habe, will ich sie euch nicht vorenthalten.

Diese Prozedur fügt frei wählbare Tausendertrennzeichen in Zahlen ein, die dann logischer als String ausgegeben wwerden müssen.

Aus 123456789 wird dann z. B. 123.456.789. Mann kann das Trennzeichen auch frei wählen und für das englische Format z. B. Kommas nehmen.

Code: Alles auswählen

Procedure.s tausendertrennzeichen(zahl.q, separator.s=".") 
   Protected zahl$=StrQ(zahl), start.l=Len(zahl$)%3, res.s=PeekS(@zahl$, start), n.l 
   For n=start To Len(zahl$)-start-1 Step 3 
      res+separator+PeekS(@zahl$+n, 3) 
   Next 
   ProcedureReturn LTrim(RemoveString(" "+res, " "+separator)) 
EndProcedure 

Debug tausendertrennzeichen(1)
Debug tausendertrennzeichen(12)
Debug tausendertrennzeichen(123)
Debug tausendertrennzeichen(1234, ",")
Debug tausendertrennzeichen(12344567890)
  • Benötigt PB 4.0 oder höher. Edit: Prozedur verbessert.
    Für Eine Procedure, die ASCII und Unicode unterstützt, siehe Seite 6!!
Das besondere: Quads müssen natürlich unterstützt werden, das tut meine Prozedur auch. AUßerdem werden auch zahlen mit weniger als 4 Stelllen korrekt behandelt.

Falls jemand eine effizientere Prozedur posten möchte, kann er dies gern tun, ich würde mich freuen. Das soll dann anregen, die beste Leistung aus PB herauszuholen, wie beim byterechner() -Wettkampf. :wink:

Re: Tausendertrennzeichen für (große) Zahlen

Verfasst: 17.11.2006 22:36
von al90
AND51 hat geschrieben:Diese Prozedur fügt frei wählbare Tausendertrennzeichen in Zahlen ein, die dann logischer als String ausgegeben wwerden müssen.
Nicht übel. Könnte ich ggf. auch schon für mein neues Tool gebrauchen. :allright:

BTW:

So langsam kommt es mir vor als würden wir an dem selben project arbeiten. :)

ich meine erst z.b. der ByteRechner, (Schon integriert bei mir) dann die
sache mit den Requestern und jetzt die Trennzeichen. Passte bis jetzt alles
wie "Faust aufs Auge" für mich und mein aktuelles Project. :D

Verfasst: 17.11.2006 22:43
von AND51
Cool!

Bearbeite verschiedene Projekte, je nachdem wozu ich gerade Lust habe. dass du meine prozeduren einbaust, ehrt mich natürlich.

Eine Zeit lang habe ich an einem HTTP-Webserver gearbeitet, bis PB 4 aus den Kinderschuhen raus ist, pasuiere ich dieses Projekt und widme mich zur Zeit TO-Multi Tool (s. Signatur, www.tomt.de.vu).

Woran arbeitest du denn?

Verfasst: 17.11.2006 22:58
von al90
AND51 hat geschrieben:Eine Zeit lang habe ich an einem HTTP-Webserver gearbeitet, bis PB 4 aus den Kinderschuhen raus ist, pasuiere ich dieses Projekt und widme mich zur Zeit TO-Multi Tool (s. Signatur, www.tomt.de.vu).
Also eine art S.A.D XP-Tuner? Nicht schlecht. :wink:
Woran arbeitest du denn?
An einem Total-Commander Clone (FileMaster) Name kann sich aber noch ändern.
Bei TC kann man z.b. mit der Leertaste die Bytes eines Dirs ermitteln.
Das kann mein Tool auch, nur hierbei wird statt der Bytes die ermittelte
grösse vom ByteRechner angezeigt. Die Trennzeichen Proc von Dir kann
ich auch gut gebrauchen um eine bessere Byte-Übersicht zu gestalten.
(Also auch TotalCommander Like)

Verfasst: 17.11.2006 23:51
von ts-soft
<offtopic on>
Mein TC macht im View auch SyntaxHighligtning für PB, ich hoffe das wird Deiner auch können :mrgreen: <offtopic off>

Verfasst: 18.11.2006 00:12
von AND51
> Also eine art S.A.D XP-Tuner?
Nicht ganz, TO-Multi Tool ist ein optionales Zusatztool für das Spiel "Tactical Ops". Das ist ähnlich wie Gouda Strike.
Es kann die Maps aus dem Cache holen und umbennen und in die eigenen Ordner kopieren, temp. Dateien löschen, einen Keybinder installieren u. v. m.!

Besonders stolz machen mich die >2.000 besucher und die >1.600 Downloads (davon >750 über winload.de).


bei den Prozeduren, die ich poste,, versuche ich darauf zu achten, dass sie die optiomale Performance erreicht und dabei möglichst klein und elegant ist. Ein Muss ist aber das protecten von Variablen, nicht nur, damit sie geschützt sind, sondern auch, damit der Code mit EnableExplicit funktioniert. Das würde sonst nicht gehen.

Habe ich übrigens sschon erwähnt, dass meine Proc hier Unicode-kompatibel ist? :wink: Habs getestet, Ergebnis ist korrekt (ist wichtig, weil PokeS() anstatt Left() verwendet wird, da schneller).

Verfasst: 18.11.2006 00:21
von AND51
Ich will bezüglich des Tausendertrennzeichens im Internationalen Breich darauf aufmerksam machen, dass jeder hinsichtlich seiner verwendeten Sprache ein individuelles tausendertrennzeichen auswählen kann:

Systemsteuerung, dann Regions- und Sprachoptionen:
Bild

Meine Prozedur -das sieht ja jeder- berücksichtigt das nicht; wer seinen "Kunden" bzw. Useern aber in seinem Programm entgegenkommen will, kann mit Hilfe der API auslesen, was der benutzer in seinem System eingestellt hat.

Hier im Bild rechts nennt sich das tausendertennzeichen übrigens "Zifferngruppierung".

Verfasst: 18.11.2006 02:53
von al90
ts-soft hat geschrieben:<offtopic on>
Mein TC macht im View auch SyntaxHighligtning für PB, ich hoffe das wird Deiner auch können :mrgreen: <offtopic off>
Im moment kümmere ich mich erstmal um alle grundfunktionen. Wir können
aber gerne später über updates reden. :mrgreen:

@AND51

Deine Proc hat leider noch einen kleinen Fehler.

Debug tausendertrennzeichen(123124)

Ergibt bei mir immer 123.4 statt 123.124

Wäre schön wenn Du das noch fixen könntest. :allright:

Verfasst: 18.11.2006 04:47
von al90
So habe jetzt auch mal was gemacht. Ist zwar nicht so kurz wie AND's Routine,
aber es funzt soweit. Weitere optimierungen und anpassungen überlasse ich euch. :mrgreen:

Code: Alles auswählen

Procedure.s FormatByteSize(zahl.q)

Protected l.l, y.l, i.l, x.l, c$, b$
l=Len(StrQ(zahl))
y=l-(l/3)*3

For i=y+1 To l
  c$+Mid(StrQ(zahl),i,1)
  x+1
  If x=3
    x=0
    If i<>l
      c$+" "
    EndIf
  EndIf
Next

b$=Left(StrQ(zahl),y)+" "+c$
ProcedureReturn ReplaceString(Trim(b$)," ",".")

EndProcedure 

Debug FormatByteSize(1) 
Debug FormatByteSize(12) 
Debug FormatByteSize(123) 
Debug FormatByteSize(1234) 
Debug FormatByteSize(12345) 
Debug FormatByteSize(123456) 
Debug FormatByteSize(1234567) 
Debug FormatByteSize(12345678) 
Debug FormatByteSize(123456789) 
Debug FormatByteSize(1234567890) 
Debug FormatByteSize(4294967295) 

Debug FormatByteSize(123124) 

Verfasst: 18.11.2006 12:50
von #NULL
noch ein stückchen schneller und einfacher:

Code: Alles auswählen

Procedure.s FormatByteSize(n.q)
  Protected s.s=StrQ(n)
  Protected len=Len(s)
  Protected ret.s
 
  For i=0 To len-1
    If i And Not i%3 :: ret="."+ret :: EndIf
    ret= Mid(s,len-i,1) +ret
  Next
 
  ProcedureReturn ret
EndProcedure

Debug FormatByteSize(1)
Debug FormatByteSize(12)
Debug FormatByteSize(123)
Debug FormatByteSize(1234)
Debug FormatByteSize(12345)
Debug FormatByteSize(123456)
Debug FormatByteSize(1234567)
Debug FormatByteSize(12345678)
Debug FormatByteSize(123456789)
Debug FormatByteSize(1234567890)
Debug FormatByteSize(4294967295)

Debug ""
DisableDebugger
t=ElapsedMilliseconds()
For i=0 To 500000
  FormatByteSize(i)
Next
t=ElapsedMilliseconds()-t
EnableDebugger
Debug t