Tausender-Punkt einfügen

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Tausender-Punkt einfügen

Re: Tausender-Punkt einfügen

by effel » 23 Jun 2020, 15:51

Hallo Gero, das war keine Kritik, Sorry wenn das so wirkt, es war keine Absicht


Wie BoBo mich schon richtig eingeschätzt hat, bin ich eher Typ; b)
"du frikelst ewig am workaround herum (Methode: "Aus Schaden wird man/frau klug"...."

Ich sah deinen code und teste dann damit rum, das mache ich quasi nur so, wie soll ich es sonst lernen. :roll:

Als du dann noch freundlicherweise die zwei Kommastellen eingebaut hast. war es für mich Perfekt und liegt in meiner Funktion() kiste

Re: Tausender-Punkt einfügen

by gero » 23 Jun 2020, 15:15

@effel
bei geros code ist aber auch bei
wert=111222333444,77
schluss, alles was mehr als 12 stellen vor dem komma hat, wird hier ignoriert

... ist doch klar ... steht doch deutlich im Definitionsbereich s.o. , weil ich üblicherweise nicht mit so grossen Zahlen jongliere ... 8-) ... und das für mich ausreichend ist ... ;)

Re: Tausender-Punkt einfügen

by BoBo » 21 Jun 2020, 09:35

Yep, der 'Deutsche' Nachkommastellen-operator erfordert es, eine solche "Zahl" im Funktionsaufruf als String zu deklarieren.

Code: Select all

MsgBox % ts("1112223334445,77")
ergibt: 2.147.483.647,77
Zu diesem Output sagt die AHK-Hilfe folgendes ...
Wenn das UpDown-Steuerelement mit einem Eingabefeld verbunden ist, empfiehlt es sich, den aktuellen Wert des UpDown-Steuerelements und nicht den des Eingabefelds abzurufen. So wird garantiert, dass immer eine im gültigen Bereich liegende Nummer zurückgegeben wird, selbst wenn der Benutzer etwas in das Eingabefeld eingetragen hat, das nicht-numerisch ist oder außerhalb des gültigen Bereichs liegt. Beachten Sie zudem, dass Zahlen länger als 3 Ziffern standardmäßig mit einem Tausendertrennzeichen (z. B. Punkt) in Dreiergruppen eingeteilt werden. Diese Trennzeichen werden nur in die Ausgabevariable des Eingabefelds gespeichert, nicht in die des UpDown-Steuerelements.
Um mittels Gui-Option eine automatisierte Ausgabe mit TS-Trennzeichen zu erhalten, muß die Variable des Eingabefeldes/Edits ausgewertet werden, die jedoch nur im definierten/zulässigen Minimal-/Maximalbereich (Range) das gewünschte Ergebnis liefert. Deshalb auch die Verlinkung im Code auf die AHK-Hilfe-Passage.

Re: Tausender-Punkt einfügen

by effel » 21 Jun 2020, 08:21

dann versuch mal..

Code: Select all

sgBox % ts(111222333444555,21)
dein code kommt mit den wirklich grossen zahlen auch nicht klar :o
2020-06-21 at 15.19.31.jpeg
2020-06-21 at 15.19.31.jpeg (23.73 KiB) Viewed 1512 times
edit:
ok ich habe oben die "" vergessen, aber nachdem ich dann deinen code richtig gefüttert habe, kam bei

Code: Select all

MsgBox % ts("1112223334445,77")
ergibt: 2.147.483.647,77
heraus :problem: das komma stimmt schon mal

bei geros code ist aber auch bei

Code: Select all

wert=111222333444,77
schluss, alles was mehr als 12 stellen vor dem komma hat, wird hier ignoriert

Re: Tausender-Punkt einfügen

by BoBo » 21 Jun 2020, 07:09

Da Nachkommastellen nicht 'bepunktet' werden, habe ich die :arrow: hier separiert, im Sinn behalten und final concateniert/angehängt. Kein Hexenwerk.

Re: Tausender-Punkt einfügen

by effel » 21 Jun 2020, 05:11

Respekt verdiene ich aber nur fürs festbeissen :shock:

leider muss ich auch den letzten Post zurückziehen

bei Milliarden Werten versagt er total

die Stellen hinter dem Komma werden abgeschnitten

auch ein durch-iterieren der gedachten Möglichkeiten bringt keinen Erfolg.

Code: Select all

Var = 11222333444,11
newVar := StrReplace( tsP(Var), SubStr((tsP(Var)), -6), "") StrReplace(SubStr((tsP(Var)), -6), ".", "")
VarAll .= newVar "`n"

newVar := StrReplace( tsP(Var), SubStr((tsP(Var)), -5), "") StrReplace(SubStr((tsP(Var)), -5), ".", "")
VarAll .= newVar "`n"

newVar := StrReplace( tsP(Var), SubStr((tsP(Var)), -4), "") StrReplace(SubStr((tsP(Var)), -4), ".", "")
VarAll .= newVar "`n"

newVar := StrReplace( tsP(Var), SubStr((tsP(Var)), -3), "") StrReplace(SubStr((tsP(Var)), -3), ".", "")
VarAll .= newVar "`n"

newVar := StrReplace( tsP(Var), SubStr((tsP(Var)), -2), "") StrReplace(SubStr((tsP(Var)), -2), ".", "")
VarAll .= newVar "`n"

newVar := StrReplace( tsP(Var), SubStr((tsP(Var)), -1), "") StrReplace(SubStr((tsP(Var)), -1), ".", "")
VarAll .= newVar "`n"

MsgBox % VarAll

exitapp

tsP(ZAHL) {
StringSplit,u,ZAHL
IF (u0 > 3)   
DUMMI:= (u0=4) ? (ZAHL := u1 "." u2 u3 u4 ) : (u0=5)?(ZAHL := u1 u2 "." u3  u4 u5) : (u0=6) ? (ZAHL := u1 u2 u3 "." u4 u5 u6) : (u0=7)? (ZAHL := u1 "." u2 u3 u4 "."  u5 u6 u7) : (u0=8) ? (ZAHL := u1 u2  "." u3 u4 u5  "." u6 u7 u8) : (u0=9) ? (ZAHL := u1 u2 u3 "." u4 u5 u6 "." u7 u8 u9) : (u0=10) ? (ZAHL := u1 "." u2 u3 u4 "." u5 u6 u7 "." u8 u9 u10) : (u0=11) ? (ZAHL := u1 u2 "." u3 u4 u5 "." u6 u7 u8 "." u9 u10 u11) : (ZAHL:= u1 u2 u3 "." u4 u5 u6 "." u7 u8 u9  "." u10 u11 u12)
return ZAHL
}

Re: Tausender-Punkt einfügen

by BoBo » 21 Jun 2020, 03:09

@gero/@effel Respekt sich dran festzubeissen. Jetzt gibts dazu zwei (bzw mehrere) Vorgehensweisen.
a) du schaust dir den funktionierenden code von anderen an, um final zu verinnerlichen warum der jetzt genau funktioniert ODER ...
b) du frikelst ewig am workaround herum (Methode: "Aus Schaden wird man/frau klug") und hast im Erfolgsfall dann 'lediglich' doch wieder einen workaround - mit dem side-effect das du dabei in der Mehrzahl üben wirst wie es nicht funktioniert.

Noch deutlicher als beim Coden wird dies z.B. beim Musikinstrument lernen.
Orientiert man/frau sich da in der Regel am (Lieblings)Star, oder am Mitschüler, der mitunter schlechter spielt als man/frau selbst?

Da fällt mir gerade ein ... RegEx. Glashaus. Steine. :lol: :shh: :silent:
Happy scripting,
BoBo 8-)

PS. Ein guter Maßstab für 'advanced' Code ist dessen Umfang. Weniger ist da oft mehr, Negligé-Prinzip :mrgreen:
Kriterium für das professionelle Umfeld: maintenance.

Gutes (aktuelles) Beispiel (im selben Thread) ...
:arrow: boiler
:arrow: flyingDman
:arrow: Rohwedder

Re: Tausender-Punkt einfügen

by effel » 20 Jun 2020, 18:22

Code: Select all

Var = 1234567,23

newVar := StrReplace( tsP(Var), SubStr((tsP(Var)), -6), "") StrReplace(SubStr((tsP(Var)), -6), ".", "")
MsgBox % newVar 
exitapp

tsP(ZAHL) {
StringSplit,u,ZAHL
IF (u0 > 3)   
DUMMI:= (u0=4) ? (ZAHL := u1 "." u2 u3 u4 ) : (u0=5)?(ZAHL := u1 u2 "." u3  u4 u5) : (u0=6) ? (ZAHL := u1 u2 u3 "." u4 u5 u6) : (u0=7)? (ZAHL := u1 "." u2 u3 u4 "."  u5 u6 u7) : (u0=8) ? (ZAHL := u1 u2  "." u3 u4 u5  "." u6 u7 u8) : (u0=9) ? (ZAHL := u1 u2 u3 "." u4 u5 u6 "." u7 u8 u9) : (u0=10) ? (ZAHL := u1 "." u2 u3 u4 "." u5 u6 u7 "." u8 u9 u10) : (u0=11) ? (ZAHL := u1 u2 "." u3 u4 u5 "." u6 u7 u8 "." u9 u10 u11) : (ZAHL:= u1 u2 u3 "." u4 u5 u6 "." u7 u8 u9  "." u10 u11 u12)
return ZAHL
}

Re: Tausender-Punkt einfügen

by effel » 20 Jun 2020, 17:37

das ist besser bei der Vorversion war auch noch ein störender Punkt vor dem Komma

Code: Select all

1.234.567.,23
ich habe mich noch etwas damit beschäftigt, als Übung. brauche den Code aktuell gar nicht, aber so begreife ich es oft besser :-)
ich wollte den punkt vor dem komma weg coden.

das funktioniert auch wie es soll

Code: Select all

ZAHL = 1234567,23
ZAHL := tsP(ZAHL)
msgbox % zahl ; 1.234.567.,23

ZAHLVORHER := SubStr(ZAHL, -6)
ZAHLnachher1 := StrReplace(ZAHLVORHER, ".", "")
msgbox % "ZAHLnachher1 [567,23]`n" ZAHLnachher1 ; 567,23

ZAHLnachher := StrReplace(ZAHL, SubStr(ZAHL, -6), "")
msgbox % "ZAHLnachher [1.234.]`n" ZAHLnachher ; 1.234.

msgbox % ZAHLnachher ZAHLnachher1 ; 1.234.567,23

exitapp

tsP(ZAHL) {
StringSplit,u,ZAHL
IF (u0 > 3)   
DUMMI:= (u0=4) ? (ZAHL := u1 "." u2 u3 u4 ) : (u0=5)?(ZAHL := u1 u2 "." u3  u4 u5) : (u0=6) ? (ZAHL := u1 u2 u3 "." u4 u5 u6) : (u0=7)? (ZAHL := u1 "." u2 u3 u4 "."  u5 u6 u7) : (u0=8) ? (ZAHL := u1 u2  "." u3 u4 u5  "." u6 u7 u8) : (u0=9) ? (ZAHL := u1 u2 u3 "." u4 u5 u6 "." u7 u8 u9) : (u0=10) ? (ZAHL := u1 "." u2 u3 u4 "." u5 u6 u7 "." u8 u9 u10) : (u0=11) ? (ZAHL := u1 u2 "." u3 u4 u5 "." u6 u7 u8 "." u9 u10 u11) : (ZAHL:= u1 u2 u3 "." u4 u5 u6 "." u7 u8 u9  "." u10 u11 u12)
return ZAHL
}
jetzt war ich dabei den code zu verschachteln, das klappt nicht so dolle

Re: Tausender-Punkt einfügen

by gero » 20 Jun 2020, 17:02

Kommastellen waren überhaupt nicht vorgesehen,ebenso negative Werte, weil ich sie hier nicht brauche ... aber so sollte das bei Werten > 0 funktionieren:

Code: Select all

wert=1,33333333333
MsgBox,4096,Info,% tsp(wert)
exitapp

tsP(ZAHL) {
StringSplit,a,ZAHL,`,
IF (a0 > 1)
    IF (StrLen(a1) > 3)
        nks := "," a2
        else
        nks := ""
StringSplit,u,a1
IF (u0 > 3)   
DUMMI:= (u0=4) ? (ZAHL := u1 "." u2 u3 u4 ) : (u0=5)?(ZAHL := u1 u2 "." u3  u4 u5) : (u0=6) ? (ZAHL := u1 u2 u3 "." u4 u5 u6) : (u0=7)? (ZAHL := u1 "." u2 u3 u4 "."  u5 u6 u7) : (u0=8) ? (ZAHL := u1 u2  "." u3 u4 u5  "." u6 u7 u8) : (u0=9) ? (ZAHL := u1 u2 u3 "." u4 u5 u6 "." u7 u8 u9) : (u0=10) ? (ZAHL := u1 "." u2 u3 u4 "." u5 u6 u7 "." u8 u9 u10) : (u0=11) ? (ZAHL := u1 u2 "." u3 u4 u5 "." u6 u7 u8 "." u9 u10 u11) : (ZAHL:= u1 u2 u3 "." u4 u5 u6 "." u7 u8 u9  "." u10 u11 u12)
return ZAHL nks
}

Re: Tausender-Punkt einfügen

by effel » 20 Jun 2020, 15:39

edit: ich ziehe die frage zurück, bei einer Millionen habe ich zwei stellen hinter dem komma
---------------------------
Tausender-Punkt einfügen.ahk
---------------------------
1.234.567.,23
---------------------------
OK
---------------------------

kann man auch mehr als eine Ziffer hinter dem Komma coden?
mein Ergebnis ist 123.456.789.8,2

Code: Select all

;ZAHL = 1234567898`,2345
ZAHL = 1234567898,2345
MsgBox % tsP(ZAHL)

exitapp

tsP(ZAHL) {
StringSplit,u,ZAHL
IF (u0 > 3)   
DUMMI:= (u0=4) ? (ZAHL := u1 "." u2 u3 u4 ) : (u0=5)?(ZAHL := u1 u2 "." u3  u4 u5) : (u0=6) ? (ZAHL := u1 u2 u3 "." u4 u5 u6) : (u0=7)? (ZAHL := u1 "." u2 u3 u4 "."  u5 u6 u7) : (u0=8) ? (ZAHL := u1 u2  "." u3 u4 u5  "." u6 u7 u8) : (u0=9) ? (ZAHL := u1 u2 u3 "." u4 u5 u6 "." u7 u8 u9) : (u0=10) ? (ZAHL := u1 "." u2 u3 u4 "." u5 u6 u7 "." u8 u9 u10) : (u0=11) ? (ZAHL := u1 u2 "." u3 u4 u5 "." u6 u7 u8 "." u9 u10 u11) : (ZAHL:= u1 u2 u3 "." u4 u5 u6 "." u7 u8 u9  "." u10 u11 u12)
return ZAHL
}
/*
---------------------------
Tausender-Punkt einfügen.ahk
---------------------------
123.456.789.8,2
---------------------------
OK   
---------------------------
*/

Re: Tausender-Punkt einfügen

by gero » 20 Jun 2020, 09:16

@BoBo ...hab ich gesehen ... übersteigt mein Verständnis / meine Fähigkeiten ... :D
Ich verwende halt nur Code, den ich auch verstehe. Ich habs für mich so gelöst: ( 0 -> 100.000.000.000) ... und da es eine Kurzschluss-Operation ist, wird der ganze Schwanz im Normalfall eh nie ausgewertet.

Code: Select all

#singleinstance force
ZAHL=1
Loop,12{
MsgBox,4096,Info,% A_Index . ")   " . tsP(ZAHL)
ZAHL*=10
}
exitapp

tsP(ZAHL) {
StringSplit,u,ZAHL
IF (u0 > 3)   
DUMMI:= (u0=4) ? (ZAHL := u1 "." u2 u3 u4 ) : (u0=5)?(ZAHL := u1 u2 "." u3  u4 u5) : (u0=6) ? (ZAHL := u1 u2 u3 "." u4 u5 u6) : (u0=7)? (ZAHL := u1 "." u2 u3 u4 "."  u5 u6 u7) : (u0=8) ? (ZAHL := u1 u2  "." u3 u4 u5  "." u6 u7 u8) : (u0=9) ? (ZAHL := u1 u2 u3 "." u4 u5 u6 "." u7 u8 u9) : (u0=10) ? (ZAHL := u1 "." u2 u3 u4 "." u5 u6 u7 "." u8 u9 u10) : (u0=11) ? (ZAHL := u1 u2 "." u3 u4 u5 "." u6 u7 u8 "." u9 u10 u11) : (ZAHL:= u1 u2 u3 "." u4 u5 u6 "." u7 u8 u9  "." u10 u11 u12)
return ZAHL
}

Re: Tausender-Punkt einfügen

by BoBo » 18 Jun 2020, 15:19

eine Prüfung mit StrLen() könnte ja problemlos eingebaut werden und die Funktion quasi "universell" machen ... denk ich ... oder spricht da was dagegen (Performance) ?
Gibts da nicht gerade was in "Skripte und Funktionen"?? :mrgreen:

Re: Tausender-Punkt einfügen

by gero » 17 Jun 2020, 06:15

Ja gut ... solche Zahlen sind hier (in meinem Fall) nicht zu erwarten ... eine Prüfung mit StrLen() könnte ja problemlos eingebaut werden und die Funktion quasi "universell" machen ... denk ich ... oder spricht da was dagegen (Performance) ?

gruss
gero

Re: Tausender-Punkt einfügen

by just me » 17 Jun 2020, 05:28

@gero, ich wollte eigentlich auf ein Problem mit weniger als 4- und mehr als 6-stelligen Zahlen hinweisen. ;)

Re: Tausender-Punkt einfügen

by gero » 17 Jun 2020, 04:13

@ just me
... gefällt mir ... in eine Funktion packen ... das nehm ich ... :D

Meinen herzlichen Dank für deine Hilfe
gruss
gero

Re: Tausender-Punkt einfügen

by just me » 17 Jun 2020, 03:23

gero wrote:
16 Jun 2020, 11:05
Also ich bin ja nur so ein Gelegenheits-geradeaus-Coder ...aber in einem Loop über ca. 10.000 Zeilen alle paar Sekunden, scheint mir mein Code doch der einfachste und schnellste zu sein ... oder irrt Gero hier ?

gruss
gero
Vielleicht?

Code: Select all

#NoEnv
Zahlen := [1, 12, 123, 1234, 12345, 123456, 1234567]
For I, Zahl In Zahlen
   MsgBox, 0, Info, % Zahl . " => " . TausenderPunkt(Zahl)
ExitApp

TausenderPunkt(Zahl) {
   StringRight,x,Zahl,3
   StringTrimRight,Zahl,Zahl,3
   Zahl:= Zahl . "." . x
   Return Zahl
}

Re: Tausender-Punkt einfügen

by Ragnar » 16 Jun 2020, 11:07

BoBo wrote:
16 Jun 2020, 10:10
@Ragnar :clap: Interessante 'built-in'-option! Gehe ich recht in der Annahme, das der 'thousand separator' nach den local system settings ausgeführt wird? Hier als Punkt, auf einer Amerikanischen Dose jedoch als Komma?? :think:
Deine Annahme ist korrekt ;)

Re: Tausender-Punkt einfügen

by gero » 16 Jun 2020, 11:05

Also ich bin ja nur so ein Gelegenheits-geradeaus-Coder ...aber in einem Loop über ca. 10.000 Zeilen alle paar Sekunden, scheint mir mein Code doch der einfachste und schnellste zu sein ... oder irrt Gero hier ?

gruss
gero

Re: Tausender-Punkt einfügen

by BoBo » 16 Jun 2020, 10:10

@Ragnar :clap: Interessante 'built-in'-option! Gehe ich recht in der Annahme, das der 'thousand separator' nach den local system settings ausgeführt wird? Hier als Punkt, auf einer Amerikanischen Dose jedoch als Komma?? :think:

Top