我们已经学会了如何用str.format()的占位符{0}, {1}来做完形填空。但默认填进去的数字和时间可能格式很乱,比如小数位太多,或者时间戳是一长串看不懂的数字。 为了让我们的输出更专业、更易读,我们需要给这些填空的内容进行化妆,这就是格式说明符的作用。 格式说明符是占位符里的一个可选部分,它告诉str.format()函数,应该把填进来的数据打扮成什么样子。我们来看一个例子:
// 用当前价格和日期生成买入指令
buyText = str.format("于 {0,date,short} 以 {1,number,currency} 价格买入 {2}",
timenow, close, syminfo.ticker)
// 假设 timenow 是 2025年7月27日, close 是 278.45, syminfo.ticker 是 "AAPL"
// buyText 将是: "于 07/27/25 以 $278.45 价格买入 AAPL"
在这个例子里:
{0,date,short}:date,short就是格式说明符,它把{0}号坑里的时间戳timenow,打扮成了短日期格式。{1,number,currency}:number,currency是格式说明符,它把{1}号坑里的收盘价close,打扮成了美元货币格式。{2}:没有格式说明符,所以品种代码syminfo.ticker就以原始字符串的样子被填了进去。
格式说明符大全
PineScript为数字、日期和时间提供了丰富的预设格式说明符,足以应对绝大多数场景。下面就是完整的列表:
| 格式说明符 | 说明与示例 |
number |
通用数字格式。小数部分默认最多显示三位,大数字使用千位分隔符(逗号)。 例如:289.10 → "289.1"; 0.324901 → "0.325"; 308573783 → "308,574,783"。 |
number,integer |
整数格式。数值会四舍五入到最接近的整数。千位以上使用分隔符。 例如:629.694 → "630"; 0.0342 → "0"; 7206409.223 → "7,206,409"。 |
number,currency |
货币格式 (美元)。数值四舍五入到两位小数,并前置$符号。千位以上使用分隔符。 例如:284.1763 → "$284.18"; 0.00088 → "$0.00"; 95209.7172243 → "$95,209.72"。 |
number,percent |
百分比格式。数值会先乘以100,然后四舍五入到最接近的整数,并后置%符号。 例如:221.337201 → "22,134%";0.002349 → "0%";-0.0123 → "-1%"。 |
date |
默认日期格式。显示为“缩写月份 日, 四位年份”。 例如:2013年12月13日 → "Dec 13, 2013"。 |
date,short |
短日期格式。显示为“月/日/两位年”。 例如:2013年12月13日 → "12/13/13"。 |
date,medium |
中等日期格式。与date相同。 例如:2013年12月13日 → "Dec 13, 2013"。 |
date,long |
长日期格式。显示完整的月份名称、日期和四位年份。 例如:2013年12月13日 → "December 13, 2013"。 |
date,full |
完整日期格式。显示星期几的全名、完整的月份名称、日期和四位年份。 例如:2013年12月13日 → "Friday, December 13, 2013"。 |
time |
默认时间格式。显示12小时制的小时、分钟、秒及AM/PM指示。 例如:13:33:47 → "1:33:47 PM"。 |
time,short |
短时间格式。显示12小时制的小时、分钟及AM/PM指示。 例如:13:36 → "1:36 PM"。 |
time,medium |
中等时间格式。与time相同。 例如:13:37:44 → "1:37:44 PM"。 |
time,long |
长时间格式。显示12小时制的小时、分钟、秒、AM/PM指示及缩写时区。 例如:UTC时间13:38:19 → "1:38:19 PM UTC"。 |
time,full |
完整时间格式。显示12小时制的小时、分钟、秒、AM/PM指示及完整时区名称。 例如:UTC时间13:38:50 → "1:38:50 PM Coordinated Universal Time"。 |
注意:如果你不小心把一个普通的数字(比如收盘价269.10)用在了日期的格式说明符上(比如date,short),程序不会报错。它会把269.10当成是从1970年1月1日开始计算的毫秒数,然后给你返回一个1970年初的日期。所以一定要确保数据类型和格式说明符是匹配的。 学长再补充两点
- 如果你不指定任何格式说明符(只写
{0}),程序会用一套默认规则来显示:整数会带千位分隔符,小数最多显示三位,时间戳会显示为一个巨大的整数(毫秒数),完全没法看。 - 花括号里的空格无所谓:为了让代码好看,你可以在占位符里面随便加空格,比如
{0, number, currency}和{0,number,currency}的效果是完全一样的。
实战案例:格式化并显示开盘跳空信息
下面的指标脚本演示了如何在实际场景中综合运用多种格式说明符。 它会计算开盘跳空的大小(金额和百分比),并在图表最后一个K线上通过标签显示这些信息以及跳空发生的日期。
//@version=6
indicator(title="str.format() 格式说明符案例", overlay=true)
if barstate.islast
// 1. 计算开盘跳空的大小(金额)和百分比
openGapSize = open - close[1]
priceChange = (open - close[1]) / close[1]
// 2. 使用str.format()
labelText = str.format(
// 模板字符串,用 + 连接多行
"{0} 今日跳空 {1,number,currency} ({2,number,percent})n发生于 {3,date,full}",
// --- 下方是按顺序填充到 {0} - {3} 的参数列表 ---
syminfo.ticker, // {0}: 品种代码
openGapSize, // {1}: 跳空金额
priceChange, // {2}: 跳空百分比
time // {3}: K线时间
)
// 3. 创建标签
label.new(bar_index + 1, open, text=labelText,
color=color.new(color.blue, 75), textcolor=color.white,
style=label.style_label_left, size=size.large)
最终图表上会显示一个标签,清晰地列出跳空金额、百分比以及详细日期,这些都得益于str.format()格式说明符的灵活应用。
总结
总结一下,格式说明符是str.format()函数的点睛之笔。它让我们不必满足于默认的、粗糙的文本输出,而是可以像设计师一样,为数字、日期和时间选择最合适的皮肤(如货币、百分比、短日期等)。Pine Script为数字、日期和时间分别提供了多种预定义的格式说明符,足以应对大部分需求。熟练掌握这些预设的格式,能极大提升你图表标签和警报信息的可读性和专业度。



