Tausendertrennzeichen für (große) Zahlen

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
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Tausendertrennzeichen für (große) Zahlen

Beitrag 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:
Zuletzt geändert von AND51 am 15.01.2007 22:25, insgesamt 2-mal geändert.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
al90
Beiträge: 1101
Registriert: 06.01.2005 23:15
Kontaktdaten:

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

Beitrag 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
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
al90
Beiträge: 1101
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag 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)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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>
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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).
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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".
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
al90
Beiträge: 1101
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag 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:
Benutzeravatar
al90
Beiträge: 1101
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag 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) 
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag 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
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten