文本
连接时两侧都必须是 Text
+ 连接两个 Text。"Count: " + 5 不是 "Count: 5",而是混合类型的回退结果 Integer 0。请先用 StringFormat 将数字、Bool 和句柄转换为 Text。
StringFormat(format, value0, value1)
- 将每个
{0}替换为value0,将每个{1}替换为value1。两个值都可以是任何类型。没有{2},也没有{0:N2}这样的格式说明符。 - 它始终需要三个参数。不使用的值请传入
"":StringFormat("{0} items", n, "")。 - 要格式化两个以上的值,请嵌套调用或连接各次的结果(参见下面的示例)。
- Real 始终显示六位小数(
0.500000)。要得到整数,请先将其舍入为 Integer;要得到定点输出,请先缩放(MathRound(r * 100))。 {0}先于{1}被替换,因此如果value0的文本本身包含{1},它也会被替换。
w = WindowGetActive();
s = StringFormat(StringFormat("{0} x {1} at ", WindowGetWidth(w), WindowGetHeight(w)) + "({0}, {1})",
WindowGetX(w), WindowGetY(w));
UtilityPrint(s); // 例如 1280 x 720 at (100, 80)
测量、搜索和截取
StringGetLength计算的是 UTF-16 代码单元数,而不是字符数。基本多文种平面之外的表情符号算作 2 个。StringGetIndexOf(text, search)返回从 0 开始的索引;找不到search时返回-1。它区分大小写,并且没有“最后一次出现的位置”函数(用循环扫描)。StringGetSubstring(text, start, length):start从 0 开始。超出末尾的length会被截短,位于末尾或超出末尾的start会得到""。负数的start或length是错误,会使操作停止。- 没有索引语法(
s[0])。要取一个字符,请使用StringGetSubstring(s, i, 1)。 StringContains、StringStartsWith、StringEndsWith和StringReplace都是精确匹配且区分大小写的。要进行不区分大小写的测试,请先将两侧都转换为小写。StringToUpper/StringToLower遵循用户区域设置的大小写规则,因此能正确处理土耳其语中带点和不带点的 i。StringTrim会去除两端的空白,包括 Windows\r\n行结束符留下的\r。- 如果搜索文本或分隔符为空,
StringReplace和StringSplit会使操作停止。
拆分结果是按索引读取的缓存
一个值无法保存列表,因此 StringSplit(text, delimiter) 会将各部分存储在正在运行的脚本的上下文中,并返回部分的数量。用 StringGetSplitPartAt(i) 读取每个部分;索引超出范围时得到 ""。同一脚本中的下一次 StringSplit 会替换该缓存,因此在拆分其他内容之前,请先将需要的部分复制到变量中。每个 …EnumerateAll、…FindAll… 或 …GetAll… 内置函数与其对应的 …EnumeratedAt 读取函数配合使用时,工作方式都相同。
比较文本
== 是精确比较且区分大小写。</> 按 UTF-16 代码单元进行序数比较,这不是字典顺序:所有大写 ASCII 字母都排在所有小写字母之前,带重音的字母排在 z 之后。不要将这种顺序作为字母顺序呈现给用户。