SetFormat

Bestimmt das Format von Integern und Floating-Point-Zahlen, die das Ergebnis von mathematischen Operationen sind.

Veraltet: Dieser Befehl ist nicht für neue Skripte empfohlen. Verwenden Sie stattdessen die Format-Funktion.

SetFormat, ZahlTyp, Format

Parameter

ZahlTyp

Muss entweder IntegerFast, FloatFast, Integer oder Float sein (die beiden schnellen Modi benötigen [v1.0.48+]; siehe Schnell vs. Langsam unten).

Format

Wenn ZahlTyp Integer oder IntegerFast ist, geben Sie H oder HEX für hexadezimal oder D für dezimal an. Hexadezimalzahlen beginnen mit dem 0x-Präfix (z.B. 0xFF). In [AHK_L 42+] sind die Buchstaben A-F von hexadezimalen Integern kleingeschrieben, wenn dieser Parameter h ist, und großgeschrieben, wenn er H ist.

Wenn ZahlTyp Float oder FloatFast ist, kann Gesamtbreite.Dezimalstellen angegeben werden (z.B. 0.6). In [v1.0.46.11+] kann der Buchstabe "e" angefügt werden, um eine wissenschaftliche Schreibweise zu erzeugen, z.B. 0.6e oder 0.6E (der Großbuchstabe bewirkt, dass in jeder Zahl ein großes statt kleines E erscheint). Hinweis: In AutoHotkey 1.x muss die wissenschaftliche Schreibweise einen Dezimalpunkt enthalten; z.B. ist 1.0e1 gültig, aber nicht 1e1.

Gesamtbreite ist üblicherweise 0, wodurch Zahlen nicht mit Nullen oder Leerzeichen aufgefüllt werden. Ein Wert größer 0 bewirkt, dass Zahlen mit Leerzeichen oder Nullen aufgefüllt werden (siehe Floating-Point-Format unten), um sie auf diese Breite zu bringen.

Dezimalstellen ist die Anzahl der Dezimalstellen, die angezeigt werden sollen (inklusive Rundung). Wenn dies leer oder 0 ist, wird weder der Nachkommabereich noch der Dezimalpunkt angezeigt, d.h. Floating-Point-Ergebnisse werden als Integer angezeigt, nicht als Floating-Point-Zahlen. Der Standardwert ist 6.

Auffüllen: Wenn Gesamtbreite groß genug zum Auffüllen ist, werden Leerzeichen an die linke Seite angefügt, d.h. jede Zahl wird rechtsbündig sein. Um stattdessen eine Linksbündigkeit zu bewirken, setzen Sie ein Minuszeichen vor Gesamtbreite. Um stattdessen mit Nullen aufzufüllen, setzen Sie eine Null vor Gesamtbreite (z.B. 06.2).

Schnell vs. Langsam

In [v1.0.48+] ist es möglich, IntegerFast anstelle von Integer und FloatFast anstelle von Float zu verwenden.

Vorteile: Der schnelle Modus bewahrt die Fähigkeit von Variablen, Integer und Floating-Point-Zahlen zwischenzuspeichern, was numerisch-intensive Operationen erheblich beschleunigt. (Der langsame Modus hingegen bewirkt, dass alle numerischen Ergebnisse sofort in Zeichenketten umgewandelt und als solche gespeichert werden.)

Nachteile: Beim Speichern einer Zahl in eine Variable verzögert der schnelle Modus die Effekte von SetFormat, bis das Skript tatsächlich eine Text-/Zeichenkettenversion dieser Variable benötigt (z.B. zur Anzeige in einem Mitteilungsfenster). Da zu diesem Zeitpunkt ein anderes SetFormat aktiv sein kann (z.B. mehr oder weniger Dezimalstellen), können die Ergebnisse unerwartet ausfallen. Um das verzögerte Format sofort in Kraft treten zu lassen, verwenden Sie eine Operation wie HexWert .= "", die eine leere Zeichenkette an die aktuell in HexWert gespeicherte Zahl anfügt.

Wenn der langsame Modus "Integer" oder "Float" irgendwo im Skript verwendet wird (ohne dass diese SetFormat-Zeile ausgeführt werden muss), wird die Zwischenspeicherung von Integern bzw. Floating-Point-Zahlen deaktiviert, sobald das Skript gestartet wird.

Floating-Point-Format

In [v1.0.48+] haben Floating-Point-Variablen intern eine Genauigkeit von etwa 15 Stellen, es sei denn, SetFormat Float (also der langsame Modus) ist irgendwo im Skript vorhanden, dann wird die gespeicherte Genauigkeit von Floating-Point-Zahlen durch Dezimalstellen ermittelt (wie es schon in den Versionen vor 1.0.48 der Fall war). Mit anderen Worten, sobald ein Floating-Point-Ergebnis in eine Variable gespeichert wurde, geht die zusätzliche Genauigkeit verloren und kann nicht wiederverwendet werden, ohne die Berechnung erneut mit so etwas wie SetFormat, Float, 0.15 durchzuführen. Um den Verlust dieser Genauigkeit zu vermeiden, verzichten Sie auf SetFormat Float oder verwenden Sie stattdessen SetFormat FloatFast.

Egal ob der langsame oder schnelle Modus aktiv ist, Floating-Point-Ergebnisse und -Variablen werden jedes Mal auf Dezimalstellen abgerundet, wenn sie angezeigt oder in Zeichenketten umgewandelt werden (z.B. MsgBox oder FileAppend). Um die volle Genauigkeit zu sehen, verwenden Sie so etwas wie SetFormat, FloatFast, 0.15.

Um eine Floating-Point-Zahl in einen Integer umzuwandeln, verwenden Sie Var := Round(Var), Var := Floor(Var) oder Var := Ceil(Var). Um einen Integer in eine Floating-Point-Zahl umzuwandeln, addieren Sie 0.0 (z.B. Var += 0.0) oder verwenden Sie so etwas wie MeinFloat := Round(MeinInteger, 1).

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

Integer-Format

Integer-Ergebnisse werden normalerweise im dezimalen und nicht im hexadezimalen Format angezeigt. Um auf hexadezimal zu wechseln, verwenden Sie SetFormat, IntegerFast, Hex. Dies kann auch verwendet werden, um einen Integer in einen Hexadezimalwert umzuwandeln (oder umgekehrt), wie im Beispiel ganz unten auf dieser Seite gezeigt.

Direkt geschriebene Integer können hexadezimal oder dezimal sein. Hexadezimale Integer beginnen mit dem 0x-Präfix (z.B. 0xA9). Sie können überall dort verwendet werden, wo ein numerischer Wert erwartet wird. Zum Beispiel ist Sleep 0xFF äquivalent zu Sleep 255, unabhängig vom aktuellen Integer-Format, das mit SetFormat bestimmt wurde.

AutoHotkey unterstützt vorzeichenfähige 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 nicht verwendet wird, sind Integer standardmäßig im Dezimalformat und Floating-Point-Zahlen standardmäßig im 0.6-Format. Jeder neue Thread (z.B. ein Hotkey, ein benutzerdefinierter Menüpunkt oder eine zeitgesteuerte Subroutine) verwendet zunächst diese Standardeinstellungen. Um diese zu ändern, muss SetFormat im automatischen Ausführungsbereich (ganz oben im Skript) angegeben werden.

Eine altmodische Zuweisung wie x = %y% entfernt alle Leerzeichen am Anfang und Ende, die z.B. beim Auffüllen entstehen. Um das zu verhindern, verwenden Sie 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 [not] Typ feststellen.

Um einen Integer mit Nullen oder Leerzeichen aufzufüllen, ohne Floating-Point-Berechnungen durchzuführen, gehen Sie wie folgt vor:

Var := "          " . Var  ; Zwischen den Anführungszeichen sind 10 Leerzeichen. Um stattdessen mit Nullen aufzufüllen, ersetzen Sie die Leerzeichen mit Nullen.
Var := SubStr(Var, -9)  ; Dies füllt die Zahl in Var mit Leerzeichen bis zu einer Gesamtbreite von 10 Zeichen auf.
Var := SubStr("          " . Var, -9)  ; Eine einzeilige Alternative für die beiden oberen Zeilen.

Format(), Caching (Zwischenspeicherung), Ausdruckszuweisung (:=), EnvAdd, EnvSub, EnvMult, EnvDiv, AutoTrim, If Var is [not] Typ

Beispiele

Zeigt verschiedene Verwendungsmöglichkeiten.

Var := 11.333333
SetFormat, float, 6.2
Var -= 1  ; Setzt Var auf 10.33 mit einem Leerzeichen am Anfang, da die Gesamtbreite 6 ist.
SetFormat, float, 0.2
Var += 1  ; Setzt Var auf 11.33 ohne Leerzeichen am Anfang.
SetFormat, float, 06.0
Var += 0  ; Setzt Var auf 000011

; Wandelt einen dezimalen Integer in hexadezimal um:
SetFormat, IntegerFast, hex
Var += 0  ; Setzt Var (das vorher 11 enthielt) auf 0xb.
Var .= ""  ; Notwendig wegen schnellem Modus.
SetFormat, IntegerFast, d