Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также саму программу AutoHotkey и проблемы её использования)

Проект перевода документации AutoHotkey: перечень переведённых статей и статей в работе.

Оригинал статьи в AutoHotkey.chm: "SetFormat", в содержании - "String Management" - "SetFormat", v1.0.48.03.

Ник переводчика: YMP.

Настоящее имя переводчика: Юрий Попов.

SetFormat

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

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.

Если медленный режим 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

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2009 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.