fmt_plugin
TSL语言的跨平台实现的字符串格式化插件。
安装
(已集成到mytsl
发行版中)
(如果需要下载兼容正式版的Windows版本的动态库文件请访问这里)。
使用指南
提供的TSL函数:
fmt
fmt(format, ...)
: 按指定的格式格式化。
-
参数列表
参数 描述 format 格式,具体格式请参见附录。 ... 任意参数 -
返回值
字符串。
-
例子
fmt_locale
fmt_locale(locale, format, ...)
: 按指定locale本地化格式对整数、浮点数进行格式化。
-
参数列表
参数 描述 locale 系统本地环境名称,例如"en_US"、"zh_CN"。 format 格式,具体格式请参见附录。 ... 任意参数 -
返回值
字符串。
-
例子
需要在格式中用L
来指定做本地化。
fmt_join
fmt_join(format, array, sep)
: 按指定分隔符格式化数组。
-
参数列表
参数 描述 format 格式,具体格式请参见附录。 array 数组类型。 spe 分隔符,例如","。 -
返回值
字符串。
-
例子
fmt_join_locale
fmt_join_locale(locale, format, array, sep)
: 按指定分隔符和locale本地化格式化数组。
-
参数列表
参数 描述 locale 系统本地环境名称,例如"en_US"、"zh_CN"。 format 格式,具体格式请参见附录。 array 数组类型。 spe 分隔符,例如","。 -
返回值
字符串。
-
例子
fmt_str
fmt_str(v)
: 把变量转换成字符串,相当于 fmt("{}", v)。
-
参数列表
参数 描述 v 变量。 -
返回值
字符串。
print(format, ...)
: 按指定的格式打印。
-
参数列表
参数 描述 format 格式,具体格式请参见附录。 ... 任意参数 -
返回值 无
println
println(format, ...)
: 按指定的格式打印一行。
-
参数列表
参数 描述 format 格式,具体格式请参见附录。 ... 任意参数 -
返回值 无
vprint
vprint(...)
: 打印变量,以空格区分。
-
参数列表
参数 描述 ... 任意参数 -
返回值 无
vprintln
vprintln(...)
: 打印变量,以空格区分,会自动换行。
-
参数列表
参数 描述 ... 任意参数 -
返回值 无
hex
hex(s)
: 把字符串转成十六字机制的字符串。
-
参数列表
参数 描述 s 字符串 -
返回值
字符串。
unhex
unhex(s)
: 和hex相反的操作。
-
参数列表
参数 描述 s 字符串 -
返回值
字符串。
strptime
strptime(s, format)
: 根据format对s进行解析得到的日期时间类型。
-
参数列表
参数 描述 s 字符串类型 format 格式串,字符串类型 format支持的格式:
指令 含义 示例 %a
当地工作日的缩写。 Sun, Mon, ..., Sat %A
本地化的星期中每日的完整名称。 Sunday, Monday, ..., Saturday %w
以十进制数显示的工作日,其中0表示星期日,6表示星期六。 0, 1, ..., 6 %d
补零后,以十进制数显示的月份中的一天。 01, 02, ..., 31 %b
当地月份的缩写。 Jan, Feb, ..., Dec (en_US);Jan, Feb, ... %B
本地化的月份全名。 January, February, ..., December %m
补零后,以十进制数显示的月份。 01, 02, ..., 12 %y
补零后,以十进制数表示的,不带世纪的年份。 00, 01, ..., 99 %Y
十进制数表示的带世纪的年份。 0001, 0002, ..., 2013, 2014, ..., 9998, 9999 %H
以补零后的十进制数表示的小时(24 小时制)。 00, 01, ..., 23 %p
本地化的 AM 或 PM 。 AM, PM %M
补零后,以十进制数显示的分钟。 00, 01, ..., 59 %S
补零后,以十进制数显示的秒。 00, 01, ..., 59 %f
微秒作为一个十进制数,零填充到 6 位。 000000, 000001, ..., 999999 %z
UTC 偏移量,格式为 ±HHMM[SS[.ffffff]]
(如果是简单型对象则为空字符串)。(空), +0000, -0400, +1030, +063415, -030712.345216 %Z
时区名称。 (空), UTC, GMT %j
以补零后的十进制数表示的一年中的日序号。 001, 002, ..., 366 %U
以补零后的十进制数表示的一年中的周序号(星期日作为每周的第一天)。 在新的一年中第一个星期日之前的所有日子都被视为是在第 0 周。 00, 01, ..., 53 %W
以补零后的十进制数表示的一年中的周序号(星期一作为每周的第一天)。 在新的一年中第一个星期一之前的所有日子都被视为是在第 0 周。 00, 01, ..., 53 %x
本地化的适当日期表示。 08/16/88 %X
本地化的适当时间表示。 21:30:00 %%
字面的 '%'
字符。% -
返回值
日期时间。 如果解析转换失败会报错。
-
例子
附录
Format格式
格式字符串包含用大括号括起来的“替换字段” {}。未包含大括号的任何内容都被视为文本,将原样复制到输出中。如果需要在文本中包含{},可以通过{{和}}来转义它。“替换字段” 将会被后续的参数替换。
例如:
fmt("{}", 1) // 输出: 1
fmt("{}", 2.3) // 输出: 2.3
fmt("{}-{}", 1, 2) // 输出: 1-2
fmt("{:T}", 20190101T) // 输出:2019-01-01
fmt("{:T}", 20190101.093001T)// 输出:2019-01-01 09:30:01
fmt("{}", array(1,2,3)) // 输出:array(1,2,3)
{
}
注释的问题
可以用(*
和*)
来代替{
和}
做多行注释。
格式说明
对于基本类型和字符串类型,格式说明基于 Python 中的格式说明。
格式说明的语法是:
fill-and-align(optional) sign(optional) #(optional) 0(optional) width(optional) precision(optional) L(optional) type(optional)
填充与对齐(可选) 符号(可选) #(可选) 0(可选) 宽度(可选) 精度(可选) L(可选) 类型(可选)
符号 、 # 及 0 选项仅当使用整数或浮点显示类型时合法。
填充与对齐
填充与对齐 是一个可选的填充字符(可为任何 { 或 }外的的字符),后随对齐选项 < 、 > 、 ^ 之一。对齐选项的意义如下:
-
< :强制域对齐到可用空间起始。这在使用非整数非浮点显示类型时为默认。
-
> :强制域对齐到可用空间末尾。这在使用整数或浮点显示类型时为默认。
-
^ :强制域在可用空间中央,通过在值的前面插入n/2个字符,后面插入n/2个字符,其中n 是待插入的总字符数。
c := 120;
s0 := fmt("{:6}", 42); // s0 的值为 " 42"
s1 := fmt("{:6}", 'x'); // s1 的值为 "x "
s2 := fmt("{:*<6}", 'x'); // s2 的值为 "x*****"
s3 := fmtt("{:*>6}", 'x'); // s3 的值为 "*****x"
s4 := fmt("{:*^6}", 'x'); // s4 的值为 "**x***"
s5 := fmt("{:6d}", c); // s5 的值为 " 120"
s6 := fmt("{:6}", true); // s6 的值为 "true "
符号、 # 与 0
符号 选项能为下列之一:
- + :指示符号应该一同用于非负数和负数。在非负数的输出值前插入
+
号。 - - :指示符号应该仅用于负数(这是默认行为)。
- 空格:指示应对非负数使用前导空格,而对负数使用负号。
负零被当作负数。
符号 选项应用于浮点无穷大和NaN。
s0 := fmt("{0:},{0:+},{0:-},{0: }", 1); // s0 的值为 "1,+1,1, 1"
s1 := fmt("{0:},{0:+},{0:-},{0: }", -1); // s1 的值为 "-1,-1,-1,-1"
s2 := fmt("{0:},{0:+},{0:-},{0: }", inf); // s2 的值为 "inf,+inf,inf, inf"
s3 := fmt("{0:},{0:+},{0:-},{0: }", nan); // s3 的值为 "nan,+nan,nan, nan"
# 选项导致将替用形式用于转换。
- 对于整数类型,使用二进制、八进制或十六进制显示类型时,替用形式插入前缀(
0b
、0
或0x
)到输出值中,若有符号则于符号(可为空格)前,否则于输出值前。 - 对于浮点类型,替用形式导致有限值的转换结果始终含有小数点字符,即使其后无数位。正常情况下,小数点字符仅若有数位后随它才出现于转换结果。另外,对于 g 与 G 转换,不从结果移除尾随的零。
0 选项以前导零填充域(后随任何符号或底)到域宽,除了应用到无穷大或 NaN 时。若 0
字符与对齐选项一同出现,则忽略 0
字符。
c := 120;
s1 := fmt("{:+06d}", c); // s1 的值为 "+00120"
s2 := fmt("{:#06x}", 0xa); // s2 的值为 "0x000a"
s3 := fmt("{:<06}", -42); // s3 的值为 "-42 " (因 < 对齐忽略 0 )
宽度与精度
宽度 为正十进制数,或嵌套的替换域( {} 或 { n } )。宽度若存在则指定最小域宽。 精度 为点( . )后随非负十进制数或嵌套的替换域。此域指示精度或最大域大小。它仅能用于浮点与字符串类型。对于浮点类型,此域指定格式化精度。对于字符串类型,它提供要复制到输出的字符串前缀的估计宽度(见后述)的上界。 若 宽度 或 精度 中使用嵌套的替换域,而对应的参数不是整数类型,或为负,或对于 宽度 为零,则报错。
pi := 3.14;
s1 := fmt("{:10f}", pi); // s1 = " 3.140000" (宽度 = 10 )
s2 := fmt("{:{}f}", pi, 10); // s2 = " 3.140000" (宽度 = 10 )
s3 := fmt("{:.5f}", pi); // s3 = "3.14000" (精度 = 5 )
s4 := fmt("{:.{}f}", pi, 5); // s4 = "3.14000" (精度 = 5 )
s5 := fmt("{:10.5f}", pi); // s5 = " 3.14000"
// (宽度 = 10 ,精度 = 5 )
s6 := fmt("{:{}.{}f}", pi, 10, 5); // s6 = " 3.14000"
// (宽度 = 10 ,精度 = 5 )
b1 := fmt("{:{}f}", pi, 10.0); // 错误:宽度不是整数类型
L (本地环境特定的格式化)
L 选项导致使用本地环境特定的形式。此选项仅对算术类型合法。
- 对于整数类型,本地环境特定形式按照环境的本地环境,插入适合的数位组分隔字符。
- 对于浮点类型,本地环境特定形式按照环境的本地环境,插入适合的数位组和底分隔字符。
类型
类型 选项确定应该如何显示数据。
可用的字符串显示类型为:
-
无、 s :复制字符串到输出。
-
b :二进制格式。前缀为
0b
。 - B :同 b ,前缀为
0B
。 - c :复制字符。
- d :十进制格式。
- o :八进制格式。
- x :十六进制格式。
- X :同 x ,除了对 9 以上的数字使用大写字母且底前缀为
0X
。 - 无:同 d 。
可用的浮点表示类型为:
- a :若指定精度。
- A :同 a ,除了对 9 以上的数字使用大写字母并用
P
指示指数。 - e :转换浮点数为十进制指数记法,用
e
指示指数。 - E :同 e ,除了用
E
指示指数。 - f 、 F :转换浮点数为 ddd.ddd 样式的十进制记法。精度指定小数点字符后出现的准确数位数。 默认精度是 6。
- g :转换浮点数为十进制小数或十进制指数记法,依赖于值和精度,用
e
指示指数。 - G :同 g ,除了用
E
指示指数。
对于小写表示类型,分别格式化无穷大和 NaN 为 inf
与 nan
。对于大写表示类型,分别格式化无穷大和 NaN 为 INF
与 NAN
。
时间格式说明
{:%T
后可以带具体的格式:
填充与对齐(可选) 宽度(可选) 精度(可选) L(可选) 时间说明(可选)
下列格式说明符可用:
转换 说明符 | 解释 |
---|---|
%% |
写字面的 % 字符。 |
%n |
写换行符。 |
%t |
写水平制表符。 |
年 | |
%C %EC |
写年除以 100 向下取整除的结果。若结果为单个十进制位,则前附 0 。修饰的命令 %EC 写本地环境的替用世纪表示。 |
%y %Oy %Ey |
写年的末二位十进制数。若结果为单个数位,则前附 0 。修饰的命令 %Oy 写本地环境的替用表示。修饰的命令 %Ey 写距 %EC 的偏移(仅年)的本地环境替用表示。 |
%Y %EY |
按十进制数写年。若结果少于四位,则左填充 0 到四位。修饰的命令 %EY 写本地环境的替用完整年表示。 |
月 | |
%b %h |
写本地环境的缩写月名。 |
%B |
写本地环境的完整月名。 |
%m %Om |
按十进制数写月份(一月为 01 )。若结果为单个数位,则前附 0 。修饰的命令 %Om 写本地环境的替用表示。 |
日 | |
%d %Od |
按十进制数写月之日。若结果为单个十进制位,则前附 0 。修饰的命令 %Od 写本地环境的替用表示。 |
%e %Oe |
按十进制数写月之日。若结果为单个十进制位,则前附空格。修饰的命令 %Oe 写本地环境的替用表示。 |
星期之日 | |
%a |
写本地环境的缩写星期名。 |
%A |
写本地环境的完整星期名。 |
%u %Ou |
按十进制数写 ISO 星期之日( 1-7 ),其中星期一为 1 。修饰的命令 %Ou 写本地环境的替用表示。 |
%w %Ow |
写星期之日为十进制数( 0-6 ),其中星期日为 0 。修饰的命令 %Ow 写本地环境的替用表示。 |
基于 ISO 8601 星期的年 | |
ISO 8601 星期始于星期一而年的第一星期必须满足下列要求:包含 1 月 4 日包含该年的首个星期四 | |
%g |
写基于 ISO 8601 星期的年的后二位十进制数。若结果为单个数位,则前附 0 。 |
%G |
按十进制数写基于 ISO 8601 星期的年。若结果少于四位,则左填充 0 到四位。 |
%V %OV |
按十进制数年的 ISO 8601 星期。若结果为单个数位,则前附 0 。修饰的命令 %OV 写本地环境的替用表示。 |
年之星期/日 | |
%j |
按十进制数写年的日( 1 月 1 日为 001 )。若结果少于三位,则左填充 0 到三位。 |
%U %OU |
按十进制数写年的星期数。该年的首个星期日为 01 星期的首日。同年中之前的日在 00 星期中。若结果为单个数位,则前附 0 。修饰的命令 %OU 写本地环境的替用表示。 |
%W %OW |
按十进制数写年的星期数。该年的首个星期一为 01 星期的首日。同年中之前的日在 00 星期中。若结果为单个数位,则前附 0 。修饰的命令 %OW 写本地环境的替用表示。 |
日期 | |
%D |
等价于 "%m/%d/%y" 。 |
%F |
等价于 "%Y-%m-%d" 。 |
%x %Ex |
写本地环境的日期表示。修饰的命令 %Ex 产生本地环境的替用日期表示。 |
当天时刻 | |
%H %OH |
按十进制数字写时( 24 小时时钟)。若结果为单个数位,则前附 0 。修饰的命令 %OH 写本地环境的替用表示。 |
%I %OI |
按十进制数字写时( 12 小时时钟)。若结果为单个数位,则前附 0 。修饰的命令 %OI 写本地环境的替用表示。 |
%M %OM |
按十进制数字写分。若结果为单个数位,则前附 0 。修饰的命令 %OM 写本地环境的替用表示。 |
%S %OS |
按十进制数字写秒。若结果为单个数位,则前附 0 。若输入的精度不能准确地以秒表示,则格式为 fixed 格式且精度匹配输入精度的十进制浮点数(或若不能在 18 位小数内转换到浮点数十进制秒,则为到微秒精度)。用作小数点的字符按照本地环境本地化。修饰的命令 %OS 写本地环境的替用表示。 |
%p |
写与 12 小时时钟相关的 AM/PM 设计的本地环境版本。 |
%R |
等价于 "%H:%M" 。 |
%T |
等价于 "%H:%M:%S" 。 |
%r |
写本地环境的 12 小时时钟时间。 |
%X %EX |
写本地环境的时间表示。修饰的命令 %EX 写本地环境的替用时间表示。 |
时区 | |
%z %Ez %Oz |
以 ISO 8601 格式写自 UTC 的偏移。例如 -0430 表示 UTC 后 4 小时 30 分。若偏移为 0 ,则使用 +0000 。修饰的命令 %Ez 与 %Oz 在时与分间插入 : (例如 -04:30 )。 |
%Z |
写时区缩写。 |
杂项 | |
%c %Ec |
写本地环境的日期与时间表示。修饰的命令 %Ec 写本地环境的替用日期与时间表示。 |
s := fmt("{:T}", 20221016.123112T);
// s = 2022-10-16 12:31:12
s := fmt("{:T%Y-%m-%d %H:%M:%S}", 20221016.123112T);
// s = "2022-10-16 12:31:12"
s := fmt("{:T%D}", 20221016.123112T));
// s = "10/16/22"
s := fmt_locale("zh_CN", "{:T%Y-%m-%d %b %a %H:%M:%S UTC%z (%Z) %p}", 20221016.123112T));
// s = "2022-10-16 10月 周日 12:31:12 UTC+0800 (中国标准时间) 下午"