字符串插值(Interpolation)
$ 开头的字符串支持插值:花括号孔里的表达式求值后转成文本,拼进字符串。孔里不限于变量,算式、函数调用都行。
语法形式
完整形态 {表达式,对齐:格式}:首个 , 引出对齐宽度,首个 : 引出格式记号,两段都可省略。
格式动词
格式记号 = 动词 + 可选精度数字(如 F2、N0)。动词与数值的 ToString(format) 同表,共四个:
| 动词 | 含义 | 示例 | 输出 |
|---|---|---|---|
F | 定点小数,数字指定小数位 | {pi:F2} | 3.14 |
N | 千分位分组,数字指定小数位(缺省 2 位) | {1234567:N0} / {1234567:N} | 1,234,567 / 1,234,567.00 |
X | 十六进制(仅整型);大写 {n:X} 出 2A,小写 {n:x} 出 2a | {n:X} | 2A |
P | 百分比(乘 100 加 %),数字指定小数位 | {0.25:P0} / {0.5:P1} | 25 % / 50.0 % |
- 格式串按 InvariantCulture 渲染,不随系统区域变。
- 非数值类型(字符串、bool、Duration 等)忽略格式段:
{s:F2}对字符串就是原样输出。 - 空格式段等于没写。
对齐
对齐是整数宽度:正数右对齐,负数左对齐,不足补空格、超出不截断。
val pi = 3.14159;
print($"右对齐 [{pi,10}] 左对齐 [{pi,-10}]");右对齐 [ 3.14159] 左对齐 [3.14159 ]转义与边界
{{和}}输出字面花括号:$"{{a}}"得{a};r$形态同规。- 孔内可以写字符串字面量和括号嵌套,不会提前闭合外层串。
- 三元表达式
? :的冒号会被当成格式分隔符,复杂表达式用括号包住:$"{(cond ? a : b)}"。 - 插值串不跨行,要跨行用
r$#"..."#。 - 对齐位写非整数字面量时按 0 处理。
r$:raw 加插值
r$"..." 与 r$#"..."# 是 raw 与插值的合体:无反斜杠转义(\n 是字面两个字符)、字面段可跨行、孔照常生效。
val name = "手册";
print(r$"无转义 \n 原样,{name} 在插值里");无转义 \n 原样,手册 在插值里最后更新于 2026年10月7日
