SetFormat

优质
小牛编辑
127浏览
2023-12-01

设置数学运算得到的整数和浮点数的格式。

SetFormat, NumberType, Format

参数

NumberType

必须为 IntegerFast, FloatFast, Integer 或 Float (其中两种快速模式需要 v1.0.48+; 请参阅 备注).

Format

NumberType 为 Integer 或 IntegerFast, 对于十六进制数请指定 H 或 HEX, 而十进制则指定 D. 十六进制数必须以前缀 0x 开头 (例如 0xFF). [AHK_L 42+]: 当此参数为 h 时十六进制数会被格式化为含有小写数字 A-F, 而为 H 时则为大写形式.

NumberType 为 Float 或 FloatFast,请指定总宽度.小数位数(例如 0.6)。在 v1.0.46.11+,可以在后面添加字母“e”来得到科学计数法表示的结果;例如 0.6e0.6E(使用大写字母 E 则在结果的数字中使用大写的 E)。注:在 AutoHotkey 1.x,使用科学计数法表示格式时必须包含小数点;例如 1.0e1 是正确的但 1e1 则错误。

总宽度 通常为 0 表示结果不需要使用空格或零填充. 如果总宽度大于实际宽度, 则结果中将使用空格或零填充 (请参阅 备注) 到指定宽度.

小数位数 为要显示的小数部分的位数 (超出部分将进行四舍五入). 如果为空或零, 则结果中不会显示小数点和小数部分, 即浮点运算的结果会显示为整数而不是浮点数. 默认的小数位数为 6.

填充: 如果 总宽度 大于实际宽度, 那么结果中将在左边填充空格; 即每个数字是右对齐的. 要让数字左对齐, 请在 总宽度 前加上负号. 要使用零而不是空格填充,请在总宽度前加上零(例如 06.2)。

快速模式与慢速模式的比较

在 v1.0.48+, 可以使用 IntegerFast 代替 Integer, 和使用 FloatFast 代替 Float.
  • 优点: 快速模式能维持变量缓存整数和浮点数的能力, 这样可以极大地加快数值密集型运算. (相反地, 慢速模式强制将所有的数值结果立即转换并保存为字符串.)
  • 缺点: 保存数字到变量时, 快速模式延迟 SetFormat 的效果到脚本实际需要此变量的文本/字符串版本时 (例如要在 MsgBox 显示变量的内容). 由于不同的 SetFormat 可能同时生效 (例如更多或更少的小数位), 这可能导致不可预期的结果. 要让当前的快速模式立即生效,请执行像 HexValue .= "" 这样的操作,这个操作中把空字符串附加到当前保存在 HexValue 的数字上。

如果在脚本的任意位置使用了慢速模式 "Integer" 或 "Float", 即使 SetFormat 命令所在的这行从未执行, 在脚本开始运行时都会禁用整数或浮点数的缓冲.

浮点格式

在 v1.0.48+,浮点变量的内部精确度大约为 15 位,除非在脚本的某个位置使用了 SetFormat Float(即慢速模式)。此时, 浮点数保存的精度由 小数位数 决定 (就像 1.0.48 之前的版本那样). 换句话说,一旦浮点运算的结果保存到变量中,多余的精度会丢失并且无法通过再进行像 SetFormat, Float, 0.15 这样的计算进行还原。为了防止精度丢失,请避免在脚本中使用 SetFormat Float,或者使用 SetFormat FloatFast 代替。

不论当前有效的是快速模式还是慢速模式, 每当浮点结果和变量需要显示或转换到字符串文本 (例如 MsgBoxFileAppend) 时, 它们都会被四舍五入到 小数位数. 要查看完整的精度,请使用类似 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)  ; 这里一行实现上面两行的操作.

相关

表达式赋值 (:=), EnvAdd, EnvSub, EnvMult, EnvDiv, AutoTrim, if var is type

示例

Var = 11.333333
SetFormat, float, 6.2
Var -= 1  ; 因为总宽度为 6, 所以赋值 Var 为带一个前导空格的 10.33.
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