Яндекс.Метрика

SetFormat -Autohotkey

Задаёт формат для целых и дробных (с плавающей запятой) чисел, получаемых в результате математических операций.

Задаёт формат для целых и дробных (с плавающей запятой) чисел, получаемых в результате математических операций.

SetFormat, NumberType, Format

Параметры

NumberType Тип числа. Возможные значения: IntegerFast, FloatFast, Integer, Float (первые два требуют версию не ниже 1.0.48).
Format Для Integer и IntegerFast задайте H или Hex (шестнадцатеричное), либо D (десятичное). Все шестнадцатеричные числа начинаются с префикса 0x (например, 0xFF).

Для Float и FloatFast формат задаётся в виде TotalWidth.DecimalPlaces (ОбщаяШирина.ЧислоЗнаковПослеЗапятой — например, 0.6). С версии 1.0.46.11 можно добавлять букву "e", чтобы получить научную нотацию: например, 0.6e или 0.6E (регистр буквы "e" здесь задаёт её регистр в числе). Замечание: в AutoHotkey 1.x научная нотация должна включать десятичную точку: например, 1.0e1 допустимо, а 1e1 — нет.

TotalWidth, как правило, равна 0, что означает, что число не нужно дополнять пробелами или нулями. Если значение ненулевое, числа будут дополняться пробелами или нулями до заданной ширины.

DecimalPlaces — это число знаков после запятой (будет произведено округление). Если эта часть не указана или равна 0, число не будет содержать ни десятичной точки, ни дробной части, т.е. число будет выглядеть как целое. Значение по умолчанию — 6.

Дополнение (padding): если TotalWidth достаточно велика, к левой стороне числа будут добавлены пробелы, т.е. числа будут выравниваться по правому краю. Для выравнивания по левому краю задайте TotalWidth со знаком минус. Для дополнения нулями вместо пробелов, поставьте 0 слева от TotalWidth (например, 06.2).

Быстрый и медленный режимы (типы числа с Fast и без Fast соответственно)

С версии 1.0.48 IntegerFast может быть использован вместо Integer и FloatFast вместо Float.

  • Преимущества: быстрый режим сохраняет для переменных возможность кэширования чисел, что существенно ускоряет операции с числами. (Напротив, медленный режим принуждает все числовые результаты операций к немедленной конвертации и сохранению в виде строк.)

  • Недостатки: помещая число в переменную, быстрый режим отсрочивает действие SetFormat до того момента, когда скрипту реально понадобится строковое представление этого числа (например, для отображения в MsgBox). Поскольку к тому моменту может уже действовать SetFormat с другими параметрами (например, с большим или меньшим количеством знаков после запятой), это может привести к неожиданным результатам. Чтобы текущий быстрый формат возымел немедленный эффект, выполните операцию наподобие HexValue .= "", которая присоединяет пустую строку к числу, хранящемуся в HexValue.

Если медленный режим Integer или Float используется где-либо в скрипте, то даже если данная команда SetFormat никогда не выполняется, кэширование чисел (целых или дробных соответственно) отключается с самого начала выполнения скрипта.

Формат дробных чисел (с плавающей запятой)

С версии 1.0.48 эти числа хранятся в переменных с точностью около 15 десятичных цифр, при условии что нигде в скрипте нет команды SetFormat Float (т.е. не используется медленный режим). В противном случае точность определяется по DecimalPlaces (как это было в версиях до 1.0.48). Иными словами, когда результат вычисления сохраняется в переменную, точность сверх заданной теряется и не может быть восстановлена иначе, как путём задания более точного формата — например, SetFormat, FloatFast, 0.15 — и повторного вычисления результата. Чтобы избежать таких потерь точности, избегайте использовать SetFormat Float в скрипте, либо используйте SetFormat FloatFast.

Независимо от того, действует ли медленный или быстрый режим, дробные числа округляются до DecimalPlaces всякий раз, когда они отображаются на экране или конвертируются в строку текста (например, через MsgBox или FileAppend). Чтобы увидеть полную точность, используйте что-нибудь вроде SetFormat, FloatFast, 0.15

Для конвертации дробного числа в целое используйте команды Var:=Round(Var), Var:=Floor(Var) или Var:=Ceil(Var). Чтобы превратить целое число в дробное, прибавьте к нему 0.0 (например, Var+=0.0) или используйте что-нибудь вроде MyFloat:=Round(MyInteger, 1).

Встроенная переменная A_FormatFloat содержит текущий формат дробных чисел (например, 0.6).

Формат целых чисел

Целые результаты вычислений обычно представляются в десятичном виде. Чтобы переключиться на шестнадцатеричный, используйте команду SetFormat, IntegerFast, Hex. Это также можно использовать для конвертации целого из десятичного в шестнадцатеричное (или наоборот), как показано в примере в конце этой страницы.

Литеральные целые числа в скрипте можно писать как в шестнадцатеричном, так и в десятичном виде. Шестнадцатеричные целые начинаются с префикса 0x (например, 0xA9). Их можно использовать везде, где ожидается числовое значение. Например, Sleep 0xFF эквивалентно Sleep 255, независимо от текущего формата целых, установленного через SetFormat.

AutoHotkey поддерживает 64-битные целые, которые занимают диапазон от -9223372036854775808 (-0x8000000000000000) до 9223372036854775807 (0x7FFFFFFFFFFFFFFF).

Встроенная переменная A_FormatInteger содержит текущий формат целых чисел (H или D).

Общие замечания

Если SetFormat в скрипте не используется, целые по умолчанию представляются в десятичном виде, а дробные имеют формат 0.6. Каждый новый поток (запускаемый через горячую клавишу, пункт меню или таймер) стартует со значениями по умолчанию. Эти умолчательные значения можно изменить, если использовать SetFormat в секции автовыполнения (вверху скрипта).

Операция присвоения в старом стиле, как в примере x=%y%, опускает все предшествующие числу или следующие за ним пробелы. Чтобы избежать этого, используйте команду AutoTrim или оператор присвоения с двоеточием (например, x:=y).

Вы можете определить, содержит ли переменная числовое значение, с помощью команды if var is number/integer/float.

Чтобы дополнить целое до нужной ширины нулями или пробелами без применения к нему математики дробных чисел, следуйте этому примеру:

Var := " " . Var ; Внутри кавычек 10 пробелов. Замените их на нули, если нужно дополнение нулями. StringRight, Var, Var, 10 ; Это добавит к числу в Var такое число пробелов, чтобы общая ширина стала 10 символов. Var := SubStr(" " . Var, -9) ; То же, что выше, но в виде однострочной команды.

Примеры

Var = 11.333333 SetFormat, float, 6.2 Var -= 1 ; В Var будет число 10.33 с одним предшествующим пробелом, т.к. общая ширина — 6 символов. SetFormat, float, 0.2 Var += 1 ; В Var будет число 11.33 без предшествующих пробелов. SetFormat, float, 06.0 Var += 0 ; Var будет содержать 000011 ; Конвертирует из десятичного в шестнадцатеричное: SetFormat, IntegerFast, hex Var += 0 ; Преобразует содержимое Var из 11 в 0xb. Var .= "" ; Необходимо, т.к. действует "быстрый" режим. SetFormat, IntegerFast, d
Теги страницы: