# SetFormat

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

过时的: 不推荐在新脚本中使用此命令. 请使用 Format 函数代替.

    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.6e` 或 `0.6E`(使用大写字母 E 则在结果的数字中使用大写的 E). 注: 在 AutoHotkey 1.x, 使用科学计数法表示格式时必须包含小数点; 例如 `1.0e1` 是正确的但 `1e1` 则错误.

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

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

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

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

[v1.0.48+]: 可以使用 IntegerFast 代替 Integer, 使用 FloatFast 代替 Float.

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

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

## 浮点格式

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

不论当前有效的是快速模式还是慢速模式, 每当浮点结果和变量需要显示或转换到字符串文本时(例如 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 个空格. 要用零填充, 请把其中的空格替换为零.
    Var := SubStr(Var, -9)  ; 这里用足够的空格填充 Var 中数字使其总宽度为 10 个字符.
    Var := SubStr("          " . Var, -9)  ; 这里一行实现上面两行的操作.

## 相关

Format(), 表达式赋值(:=), 缓存, 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

dftg