SetFormat

Bestimmt das Format von Integer- und Gleitkommazahlen, die durch mathematische Operationen erzeugt wurden.

SetFormat, Zahlentyp, Format

Parameter

Zahlentyp

Muss entweder IntegerFast, FloatFast, Integer oder Float sein (die zwei Fast-Methoden benötigen v1.0.48+; siehe Anmerkungen).

Format

Wenn der Zahlentyp Integer oder IntegerFast ist, kann H oder HEX für hexadezimal, oder D für dezimal angegeben werden. Hexadezimale Zahlen beginnen mit dem 0x-Präfix (z. B. 0xFF). [AHK_L 42+]: Die Buchstaben A-F von hexadezimalen Integern sind kleingeschrieben, wenn dieser Parameter h ist, und großgeschrieben, wenn er H ist.

Wenn der Zahlentyp Float oder FloatFast ist, kann Gesamtbreite.Dezimalstellen angegeben werden (z. B. 0.6). Seit v1.0.46.11 kann der Buchstabe "e" angefügt werden, um eine wissenschaftliche Schreibweise wie z. B. 0.6e zu erzeugen, oder "E", um z. B. 0.6E zu erzeugen. Hinweis: In AutoHotkey 1.x muss die wissenschaftliche Schreibweise einen Dezimalpunkt enthalten; z. B. wäre 1.0e1 gültig, aber nicht 1e1.

Gesamtbreite ist üblicherweise 0, um die Zahl nicht mit Nullen oder Leerzeichen aufzufüllen. Ein höherer Wert wird Zahlen mit Leerzeichen oder Nullen auffüllen (siehe Bemerkungen), um sie auf diese Breite zu bringen.

Dezimalstellen ist die Anzahl der Dezimalstellen, die angezeigt werden sollen (mit einer Rundung). Fehlt dieser Wert oder ist er Null, wird weder der Dezimalteil noch der Dezimalpunkt angezeigt; das bedeutet, dass Gleitkomma-Ergebnisse als Integer- statt als Gleitkommazahlen angezeigt werden. Der Standardwert ist 6.

Auffüllen: Wenn Gesamtbreite hoch genug zum Auffüllen ist, werden Leerzeichen an die linke Seite angefügt; das bedeutet, dass jede Zahl rechtsbündig ausgerichtet wird. Um die Zahl stattdessen linksbündig auszurichten, fügt man vor Gesamtbreite ein Minuszeichen an. Um die Zahl mit Nullen statt mit Leerzeichen zu füllen, fügt man vor Gesamtbreite eine 0 an (z. B. 06.2).

Fast- vs. Slow-Modus

Seit v1.0.48 kann IntegerFast statt Integer verwendet werden, und FloatFast statt Float.

Sollte der Slow-Modus "Integer" oder "Float" irgendwo im Skript verwendet werden (ohne dass diese SetFormat-Zeile ausgeführt werden muss), wird das Zwischenspeichern von Integer- oder Gleitkommazahlen deaktiviert, sobald das Skript startet.

Gleitkomma-Format

Seit v1.0.48 haben Gleitkomma-Variablen intern eine Genauigkeit von 15 Stellen, sofern SetFormat Float (also der Slow-Modus) nicht im Skript irgendwo vorkommt. Ist dies der Fall, wird die Genauigkeit von Gleitkommazahlen über Dezimalstellen bestimmt (wie es schon in den Versionen vor 1.0.48 war). Mit anderen Worten: Sobald ein Gleitkomma-Ergebnis in eine Variable gespeichert wurde, wird die zusätzliche Genauigkeit verloren gehen und nicht wiederverwendbar sein, ohne die Berechnung nochmals mit so etwas wie SetFormat, Float, 0.15 durchzuführen. Damit diese Genauigkeit nicht verloren geht, verzichtet man auf SetFormat Float oder benutzt stattdessen SetFormat FloatFast.

Egal ob der Slow- oder Fast-Modus aktiv ist - Gleitkomma-Ergebnisse und -Variablen werden auf die angegebenen Dezimalstellen abgerundet, wann immer sie angezeigt oder in Zeichenketten umgewandelt werden (z. B. MsgBox oder FileAppend). Um die volle Präzision zu sehen, nutzt man so etwas wie SetFormat, FloatFast, 0.15.

Um eine Gleitkommazahl in einen Integer umzuwandeln, nutzt man Var := Round(Var), Var := Floor(Var) oder Var := Ceil(Var). Um einen Integer in eine Gleitkommazahl umzuwandeln, addiert man 0.0 (z. B. Var += 0.0) oder nutzt so etwas wie MeinFloat := Round(MeinInteger, 1).

Die interne Variable A_FormatFloat enthält das aktuelle Gleitkomma-Format (z. B. 0.6).

Integer-Format

Integer-Ergebnisse werden normalerweise im dezimalen Format angezeigt, nicht im hexadezimalen. Um auf hexadezimal umzuschalten, nutzt man SetFormat, IntegerFast, Hex. Damit kann man auch ein Integer in eine hexadezimale Zahl umwandeln (oder umgekehrt), wie in dem Beispiel ganz unten.

Direkt im Skript angegebene Integer können als hexadezimale oder dezimale Zahlen geschrieben werden. Alle hexadezimale Integer beginnen mit dem 0x-Präfix (z. B. 0xA9). Sie können überall dort eingesetzt werden, wo ein numerischer Wert erwartet wird. Zum Beispiel wäre Sleep 0xFF das gleiche wie Sleep 255, egal welches Integer-Format von SetFormat gesetzt wurde.

AutoHotkey unterstützt vorzeichenbehaftete 64-Bit-Integer im Bereich von -9223372036854775808 (-0x8000000000000000) bis 9223372036854775807 (0x7FFFFFFFFFFFFFFF).

Die interne Variable A_FormatInteger enthält das aktuelle Integer-Format (H oder D).

Allgemeine Bemerkungen

Wenn SetFormat nirgendwo im Skript vorkommt, gelten für Integer standardmäßig das Dezimalformat, und für Gleitkommazahlen standardmäßig Gesamtbreite.Dezimalstellen = 0.6. Jeder neu gestartete Thread (z. B. ein Hotkey, ein benutzerdefinierter Menüpunkt oder eine zeitgesteuerte Subroutine) beginnt mit der Standardeinstellung des Befehls. Die Standardwerte können jedoch geändert werden, wenn SetFormat im automatischen Ausführungsbereich verwendet wird (oberster Bereich des Skripts).

Bei einer altmodischen Zuweisung wie x = %y% werden Leerzeichen am Anfang oder Ende weggelassen (z. B. beim Auffüllen). Um das zu verhindern, nutzt man AutoTrim oder den Doppelpunkt-Gleich-Operator (z. B. x := y).

Ob eine Variable einen numerischen Wert enthält, können Sie mit "if var is number/integer/float" feststellen.

Das folgende Beispiel zeigt, wie ein Integer mit Nullen oder Leerzeichen gefüllt werden kann, ohne Gleitkommaberechnungen durchführen zu müssen:

Var := "          " . Var     ; Zwischen den Anführungszeichen sind 10 Leerzeichen.  Um mit Nullen zu füllen, ersetzt man die Leerzeichen mit Nullen.
StringRight, Var, Var, 10  ; Dies füllt die Zahl in Var mit genügend Leerzeichen auf, um sie auf eine Länge von maximal 10 Zeichen zu bringen.
Var := SubStr("          " . Var, -9)  ; Eine einzeilige Alternative für die oberen zwei Zeilen.

Siehe auch

Format(), Ausdruckszuweisung (:=), EnvAdd, EnvSub, EnvMult, EnvDiv, AutoTrim, if Var is Typ

Beispiele

Var = 11.333333
SetFormat, float, 6.2
Var -= 1  ; Setzt Var auf 10.33 und aufgrund einer Gesamtbreite von 6 mit einem Leerzeichen davor.
SetFormat, float, 0.2
Var += 1  ; Setzt Var auf 11.33 ohne Leerzeichen davor.
SetFormat, float, 06.0
Var += 0  ; Setzt Var auf 000011

; Wandelt einen dezimalen Integer in hexadezimal um:
SetFormat, IntegerFast, hex
Var += 0  ; Setzt Var (die vorher 11 enthielt) auf 0xb.
Var .= ""  ; Aufgrund des Fast-Modus notwendig.
SetFormat, IntegerFast, d