Page 1 of 2
Tausender-Punkt einfügen
Posted: 16 Jun 2020, 04:00
by gero
Hallo zusammen
Ich denke mal, dass es eleganter (einfacher) gehen müsste einen Tausender-Punkt in einen String zu bekommen, als mein Code das macht ... irgendwie mit "Format" - finde aber nichts entsprechendes.
Etwas Hilfe wäre sehr willkommen
gruss
gero
Code: Select all
String:=100000
StringRight,x,String,3
StringTrimRight,String,String,3
String:= String . "." . x
MsgBox,4096,Info,% String
Re: Tausender-Punkt einfügen
Posted: 16 Jun 2020, 04:36
by just me
Re: Tausender-Punkt einfügen
Posted: 16 Jun 2020, 05:43
by gero
@ just me... ja danke ... aber so gesehen ist mein einfacher "Standard-Code-3-zeiler" schon recht schlank - gelle
gruss
gero
Re: Tausender-Punkt einfügen
Posted: 16 Jun 2020, 08:14
by nacken012
Code: Select all
String:=1000000
while (oldText != (String := RegExReplace(String, "(\d)(\d\d\d(?:\D|$))", "$1.$2")))
oldText := String
MsgBox, %String%
Re: Tausender-Punkt einfügen
Posted: 16 Jun 2020, 09:24
by Ragnar
Code: Select all
Zahl := 100000
Gui, Add, Edit, vE
Gui, Add, UpDown, Range-2147483648-2147483647, % Zahl
GuiControlGet, KonvertierteZahl,, E
MsgBox % KonvertierteZahl
Re: Tausender-Punkt einfügen
Posted: 16 Jun 2020, 10:10
by BoBo
@Ragnar 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??
Re: Tausender-Punkt einfügen
Posted: 16 Jun 2020, 11:05
by gero
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
Posted: 16 Jun 2020, 11:07
by Ragnar
BoBo wrote: ↑16 Jun 2020, 10:10
@Ragnar
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??
Deine Annahme ist korrekt
Re: Tausender-Punkt einfügen Topic is solved
Posted: 17 Jun 2020, 03:23
by just me
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
Posted: 17 Jun 2020, 04:13
by gero
@ just me
... gefällt mir ... in eine Funktion packen ... das nehm ich ...
Meinen herzlichen Dank für deine Hilfe
gruss
gero
Re: Tausender-Punkt einfügen
Posted: 17 Jun 2020, 05:28
by just me
@gero, ich wollte eigentlich auf ein Problem mit weniger als 4- und mehr als 6-stelligen Zahlen hinweisen.
Re: Tausender-Punkt einfügen
Posted: 17 Jun 2020, 06:15
by gero
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
Posted: 18 Jun 2020, 15:19
by BoBo
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"??
Re: Tausender-Punkt einfügen
Posted: 20 Jun 2020, 09:16
by gero
@BoBo ...hab ich gesehen ... übersteigt mein Verständnis / meine Fähigkeiten ...
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
Posted: 20 Jun 2020, 15:39
by effel
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
Posted: 20 Jun 2020, 17:02
by gero
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
Posted: 20 Jun 2020, 17:37
by effel
das ist besser bei der Vorversion war auch noch ein störender Punkt vor dem Komma
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
Posted: 20 Jun 2020, 18:22
by effel
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
Posted: 21 Jun 2020, 03:09
by BoBo
@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.
Happy scripting,
BoBo
PS.
Ein guter Maßstab für 'advanced' Code ist dessen Umfang. Weniger ist da oft mehr, Negligé-Prinzip
Kriterium für das professionelle Umfeld: maintenance.
Gutes (aktuelles) Beispiel (im selben Thread) ...
boiler
flyingDman
Rohwedder
Re: Tausender-Punkt einfügen
Posted: 21 Jun 2020, 05:11
by effel
Respekt verdiene ich aber nur fürs festbeissen
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
}