Skip to Content

字符串插值(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日