跳转至

fmt_plugin

TSL语言的跨平台实现的字符串格式化插件。

安装

(已集成到mytsl发行版中)

(如果需要下载兼容正式版的Windows版本的动态库文件请访问这里)。

使用指南

提供的TSL函数:

fmt

fmt(format, ...): 按指定的格式格式化。

  • 参数列表

    参数 描述
    format 格式,具体格式请参见附录。
    ... 任意参数
  • 返回值

    字符串。

  • 例子

    s := fmt("{:.3f}", 4.1255);
    // s = "4.126"
    // 还支持动态指定精度、宽度
    s := fmt("{:.{}f}", 4.1255, 3);
    // s = "4.126"
    fmt("{:.{}f}", 3.14, 1);
    // s = "3.1"
    

fmt_locale

fmt_locale(locale, format, ...): 按指定locale本地化格式对整数、浮点数进行格式化。

  • 参数列表

    参数 描述
    locale 系统本地环境名称,例如"en_US"、"zh_CN"。
    format 格式,具体格式请参见附录。
    ... 任意参数
  • 返回值

    字符串。

  • 例子

    s := fmt_locale("en_US", "{:.8Lf}", 2002598998.70000005);
    s = "2,002,598,998.70000005"
    
    需要在格式中用L来指定做本地化。

fmt_join

fmt_join(format, array, sep): 按指定分隔符格式化数组。

  • 参数列表

    参数 描述
    format 格式,具体格式请参见附录。
    array 数组类型。
    spe 分隔符,例如","。
  • 返回值

    字符串。

  • 例子

    s := fmt_join("{}", array(1,2,3), ', ');
    s = "1, 2, 3"
    

fmt_join_locale

fmt_join_locale(locale, format, array, sep): 按指定分隔符和locale本地化格式化数组。

  • 参数列表

    参数 描述
    locale 系统本地环境名称,例如"en_US"、"zh_CN"。
    format 格式,具体格式请参见附录。
    array 数组类型。
    spe 分隔符,例如","。
  • 返回值

    字符串。

  • 例子

    s := fmt_join_locale("en_US", "{:Lf}", array(1234.5678,2345.5678,345678.90), '|');
    s = "1,234.567800|2,345.567800|345,678.900000"
    

fmt_str

fmt_str(v): 把变量转换成字符串,相当于 fmt("{}", v)。

  • 参数列表

    参数 描述
    v 变量。
  • 返回值

    字符串。

print

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
    %% 字面的 '%' 字符。 %
  • 返回值

    日期时间。 如果解析转换失败会报错。

  • 例子

    dt := strptime("2019-12-31 10:01:01", "%Y-%m-%d %H:%M:%S");
    // dt=43830.41737268519
    

附录

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"

# 选项导致将替用形式用于转换。

  • 对于整数类型,使用二进制、八进制或十六进制显示类型时,替用形式插入前缀( 0b00x )到输出值中,若有符号则于符号(可为空格)前,否则于输出值前。
  • 对于浮点类型,替用形式导致有限值的转换结果始终含有小数点字符,即使其后无数位。正常情况下,小数点字符仅若有数位后随它才出现于转换结果。另外,对于 gG 转换,不从结果移除尾随的零。

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 指示指数。
  • fF :转换浮点数为 ddd.ddd 样式的十进制记法。精度指定小数点字符后出现的准确数位数。 默认精度是 6。
  • g :转换浮点数为十进制小数或十进制指数记法,依赖于值和精度,用 e 指示指数。
  • G :同 g ,除了用 E 指示指数。

对于小写表示类型,分别格式化无穷大和 NaN 为 infnan 。对于大写表示类型,分别格式化无穷大和 NaN 为 INFNAN

时间格式说明

{:%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 (中国标准时间) 下午"

TODO

fmt_str函数可以通过检查对象是否有str()方法,如有可以调用该方法来生成字符串,从而可以让对象自定义其字符串的表达形式