上一节我们学习了str.format()中那些方便快捷的预设格式(如number,currency)。但如果你想实现更精细的效果,比如强制保留4位小数或者“显示带千位符的整数”,这些预设格式就不够用了。 这时,我们就需要进入str.format()的专业模式——使用模式占位符来自定义数字的显示格式。这就像从用相机的自动挡,切换到了手动挡,虽然需要多了解几个参数,但你能完全控制最终的成像效果。
专业模式的语法
要使用自定义模板,你需要在占位符里,紧跟在number说明符后面,写上你用模式占位符组合出来的模板字符串。它的结构是:{索引, number, 你的自定义模板}。 例如:plotLabel = str.format("当前收盘价: {0,number,0.0}", close) 这里的0.0就是由模式占位符组成的自定义模板,它规定了输出的数字必须带有一位小数。
模式占位符大全
要进入专业模式,你首先要认识这几个核心的模式占位符,它们是构成你自定义模板的零件:
| 占位符 | 含义与示例 |
0 |
数字位(或补零):代表一位数字。如果原始数值在该位置有数字,则显示该数字;否则,显示0。用于确保固定的位数。 示例:模板"000.00",值0.15 → "000.15";值66870.3 → "66870.30"。 |
# |
数字位(或不显示):代表一位数字。如果原始数值在该位置有数字,则显示该数字;否则,不显示任何内容(即不会用0补齐)。 示例:模板"#,###.###",值-90.0581 → "-90.058";值66193.1 → "66,193.1"。 |
. |
小数点分隔符:定义小数点在输出字符串中的位置。 |
, |
分组分隔符:通常用作千位分隔符,使大数字更易读。 |
% |
百分比符号:将原始数值乘以100,然后在结果末尾附加一个百分号%。 示例:模板"0.0%",值0.123 → "12.3%"。 |
‰ |
千分比符号:将原始数值乘以1000,然后在结果末尾附加一个千分号‰。 示例:模板"0.0‰",值0.043 → "43.0‰"。 |
E0 |
科学计数法:以科学记数法显示数字。E之后的0的数量决定了指数部分显示的最小位数。 示例:模板"0.00E0",值600000000 → "6.00E8"。 |
注意:如果想在模板里显示0、#这些特殊字符本身,而不是让它们作为占位符,需要用单引号' '把它们括起来进行转义。
常用组合示例
单独看每个零件可能有点抽象,但把它们组合起来,就能实现各种强大的效果。下面是一些最常用的组合,建议你收藏起来随时查阅:
| 模板示例 | 说明 | 输出示例 (假设输入为一系列不同值) |
0.0 |
始终显示一位小数,不足补零,多余则四舍五入。 | "120.3"; "38203.2"; "-3123.0" |
0.0000 |
始终显示四位小数,不足补零,多余则四舍五入。 | "-22.7369"; "94084.0300"; "0.3796" |
#.### |
最多显示三位小数,不补尾随零,多余则四舍五入。 | "149.2"; "58935.939"; "-0.06" |
0.00% |
数值乘以100,结果始终显示两位小数,并带百分号。 | "-0.0789" → "-7.89%"; "0.8506" → "85.06%" |
#,###.00 |
带千位分隔符(如果数值够大),始终显示两位小数。 | "-21.623" → "-21.62"; "36661.3" → "36,661.30" |
0.00E0 |
科学计数法,尾数始终显示两位小数,指数至少显示一位。 | "-78.1" → "-7.81E1"; "38700" → "3.87E4" |
实战案例:综合运用模式占位符创建信息标签
下面的指标脚本演示了如何在实际应用中,通过str.format()的模式占位符,将收盘价、价格变动百分比和成交量格式化后,显示在图表的最后一个K线的标签上。
//@version=6
indicator(title="str.format() 模式占位符示例", overlay=true)
if barstate.islast
// 1. 计算价格较上一根K线的变动百分比
priceChange = (close - close[1]) / close[1]
// 2. 使用str.format()和模式占位符
barText = str.format(
// 模板字符串,用 n 换行
"收盘价: {0,number,$#,##0.00}n" +
"涨跌幅: {1,number,0.0%}n" +
"成交量: {2,number,#,###}",
// --- 下方是按顺序填充的参数列表 ---
close, // -> {0}: 收盘价。'$#,##0.00' 模板表示:带'$',千位符,强制2位小数
priceChange, // -> {1}: 涨跌幅。'0.0%' 模板表示:乘以100,保留1位小数,带'%'
volume // -> {2}: 成交量。'#,###' 模板表示:整数,带千位符
)
// 3. 创建标签
label.new(bar_index, high, text=barText,
color=color.new(color.navy, 15), textcolor=color.white,
size=size.large, style=label.style_label_left)
通过模式占位符的灵活运用,我们可以使输出的文本信息既准确又易于阅读。
总结
总结一下,模式占位符是str.format()函数的终极武器。它让你从格式的使用者变成了设计者,它需要放置在占位符中,并且位于number这个预定义格式说明符之后(例如 {0,number,0.00})。通过组合0, #, ., ,, %等几个简单的符号,你就能创造出任何你想要的数字文本格式,让你的图表标签和警报信息,无论在内容上还是形式上,都达到专业水准。



