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

Beitrag von AND51 »

>@and110011
>deine proc vermisst unicode.
Doch, das tut sie jetzt. <)
es war nur eine winzig kleine Veränderung nötig, überall, wo mit Peeks() gearbeitet wird, das Anhängsel *(1+#PB_Compiler_Unicode) bei Pointern etc. hinzuzufügen. Normalerweise, wird ind er FOR-Schleife mit PeekS() nur drei Zeichen (=drei Bytes) gelesen. Das Anhängsel bewirkt, dass bei eingeschaltetem Unicode die 3 auf eine 6 erweitert wird. Somit ist keine zusätzliche IF-Abfrage nötig.
Damit ist meine proc auch endlich vollendet. (hoffe ich)

Code: Alles auswählen

Procedure.s tausendertrennzeichen(zahl.q, separator.s=".") 
   If zahl > -1000 And zahl < 1000 
      ProcedureReturn Str(zahl) 
   EndIf 
   Protected zahl$=RemoveString(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*(1+#PB_Compiler_Unicode), 3*(1+#PB_Compiler_Unicode)) 
   Next 
   If zahl < 0 
      res="-"+res 
   EndIf 
   If start 
      ProcedureReturn res 
   Else 
      ProcedureReturn PeekS(@res+Len(separator)*(1+#PB_Compiler_Unicode)) 
   EndIf 
EndProcedure 

Debug tausendertrennzeichen(1234567890) 
Debug tausendertrennzeichen(123456789) 
Debug tausendertrennzeichen(12345678) 
Debug tausendertrennzeichen(1234567) 
Debug tausendertrennzeichen(123456) 
Debug tausendertrennzeichen(12345) 
Debug tausendertrennzeichen(1234) 
Debug tausendertrennzeichen(123) 
Debug tausendertrennzeichen(12) 
Debug tausendertrennzeichen(1) 
Debug tausendertrennzeichen(0) 
Debug tausendertrennzeichen(-1) 
Debug tausendertrennzeichen(-12) 
Debug tausendertrennzeichen(-123) 
Debug tausendertrennzeichen(-1234) 
Debug tausendertrennzeichen(-12345) 
Debug tausendertrennzeichen(-123456) 
Debug tausendertrennzeichen(-1234567) 
Debug tausendertrennzeichen(-12345678) 
Debug tausendertrennzeichen(-123456789) 
Debug tausendertrennzeichen(-1234567890)
Ich persönlich habe noch nie mit Unicode gearbeitet und sehe derzeit auch keinen Grund, warum ich umsteigen sollte, deshalb habe ich leider nicht so die Erfahrung damit... :oops:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

AND51 hat geschrieben:*(1+#PB_Compiler_Unicode)
...gabs da nich ne konstante oder funktion,
die direkt die größe eines zeichens im momentan verwendeten modus zurückgibt?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Sizeof(Character) is the way to go...
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Tut mir leid, aber ich habe direkt noch nie mit Unicode gearbeitet, deswegen denke ich an sowas nicht; ich weiß nur, das ein Zeichen in Unicode 2 Byte groß ist; da greift die von Kaeru zitierte Formel aber auch 8)

Und ihr müsst doch zugeben, dass das ziemlich einfallsreich ist, oder? :wink:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

AND51 hat geschrieben:Und ihr müsst doch zugeben, dass das ziemlich einfallsreich ist, oder? :wink:
Ja man merkt schon das du nicht nachgedacht hast. Wer sagt dir denn
das die Konstante immer 1 haben wird ? SizeOf(Character) ist, wie remi
schon geschrieben hat, der richtige Weg.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Habe mir SiozeOf() in der Hilfe angesehen und festgestellt, das dass daselbe ist, wie meines; trotzdem ist SizeOf() viel besser.

>Wer sagt dir denn das die Konstante immer 1 haben wird ?
Ich sage das, weil (1+#PB_Compiler_Unicode) 1 ergeben wird, wenn das programm in ASCII kompiliert wird. n*1 bleibt für ASCII also genau daselbe wie n.

Der Ausdruck wird aber 2 ergeben, wenn das programm in Unicode kompiliert wird. Die Länge n mit 2 multipliziert ergibt den Speicherverbrauch, da 1 Zeichen=2 Byte in Unicode.

#PB_Compiler_Unicode ist also entweder immer 0 (ASCII) oder 1 (Unicode).
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

edel meint nicht (nur) das ergebnis deines ausdruckes, sondern die konstante selbst. da die konstante keine zahl repräsentieren soll, sondern eher sowas wie einen boolean-flag. kann sie in zukunft auch andere werte haben. ist nicht wahrscheinlich, aber sie als numerischen wert zu verwenden ist nicht besonders weitsichtig.
my pb stuff..
Bild..jedenfalls war das mal so.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

sic.

also für solche fälle:

Code: Alles auswählen

* ( 1+  ( #False Or ( #PB_Compiler_Unicode <> #False ) ) )
:mrgreen:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

:mrgreen:
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ich habe 100%ig verstanden was ihr meint. Trotzdem ist es kein Booloean; die Klammern verwende ich nur wegen Punkt vor Strichrechnung.
Wie gesagt, ich habe genau verstanden, was ihr meint und gebe jetzt auch Ruhe. :)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten