An OTP library to format term, for efficient base on otp-25.2.1
$ rebar3 compile
~F.P.PadModC 其中 C是唯一必填字段 F, P, Pad和Mod是可选的
F是打印参数的字段宽度。负值表示参数在字段内左对齐,否则右对齐。如果未指定字段宽度,则使用所需的打印宽度。如果指定的字段宽度太小,则整个字段都用*字符填充。
P是打印参数的精度。如果未指定精度,则使用默认值。精度的解释取决于控制序列。除非另有说明,参数within用于确定打印宽度。
Pad是填充字符。这是用于填充参数的打印表示的字符,以使其符合指定的字段宽度和精度。只能指定一个填充字符,并且在适用的情况下,它用于字段宽度和精度。默认的填充字符是' '(空格)。
Mod是控制序列修饰符。这是一个或多个改变数据解释的字符 。当前的修饰符是t,用于 Unicode 翻译,l,用于阻止p和P 检测可打印字符。
如果如果F、P或Pad是*字符,则Data中的下一个参数用作值。例如:io:fwrite("~*.*.0f~n",[9, 5, 3.14159265]). -> 003.14159
要将文字*字符用作Pad,它必须作为参数传递:io:fwrite("~*.*.*f~n",[9, 5, $*, 3.14159265]). -> **3.14159
~ Character ~ is written.
c 参数是一个被解释为 ASCII 代码的数字。精度是打印字符的次数,默认为字段宽度,而字段宽度又默认为 1. Example:
1> io:fwrite("|~10.5c|~-10.5c|~5c|~n", [$a, $b, $c]). -> | aaaaa|bbbbb |ccccc|
如果 Unicode 转换修饰符 ( t ) 有效,整数参数可以是代表有效 Unicode 代码点的任何数字,否则它是一个小于或等于 255 的整数,否则它被 16#FF 屏蔽:
2> io:fwrite("~tc~n",[1024]).
\x{400}
ok
3> io:fwrite("~c~n",[1024]).
^@
ok
f 参数是一个浮点数,写为 [-]ddd.ddd,其中精度是小数点后的位数。默认精度为 6,不能小于 1。
e 参数是一个浮点数,写为 [-]d.ddde+-ddd,其中精度是写入的位数。默认精度为 6,不能小于 2。
g 参数是一个浮点数,如果它 >= 0.1 且 < 10000.0 ,则写为f 。否则,以e格式写入。精度是有效数字的个数。默认为6,不会<2。如果float的绝对值不允许用f格式写成想要的有效位数,也写成e格式。
s 使用字符串语法打印参数。参数是,如果不存在 Unicode 转换修饰符, 则为 iolist()、binary()或atom()。如果 Unicode 转换修饰符 ( t ) 有效,则参数为unicode:chardata(),这意味着二进制文件采用 UTF-8。打印的字符不带引号。该字符串首先按指定的精度截断,然后填充并对齐到指定的字段宽度。默认精度是字段宽度。此格式可用于打印任何对象并截断输出以适合指定字段:
1> io:fwrite("|~10w|~n", [{hey, hey, hey}]).
|**********|
ok
2> io:fwrite("|~10s|~n", [io_lib:write({hey, hey, hey})]).
|{hey,hey,h|
3> io:fwrite("|~-10.8s|~n", [io_lib:write({hey, hey, hey})]).
|{hey,hey |
ok
如果未指定 Unicode 转换修饰符,则整数列表 > 255 被视为错误:
4> io:fwrite("~ts~n",[[1024]]).
\x{400}
ok
5> io:fwrite("~s~n",[[1024]]).
** exception error: bad argument
in function io:format/3
called as io:format(<0.53.0>,"~s~n",[[1024]])
w 使用标准语法写入数据。这用于输出 Erlang 术语。如果原子包含嵌入的不可打印字符,则它们将打印在引号内。除非使用 Unicode 转换修饰符 ( t ) ,否则将转义大于 255 的原子字符。浮点数被准确打印为最短、正确舍入的字符串。
p 以与~w相同的方式使用标准语法写入数据 ,但将打印表示长于一行的术语分成多行,并明智地缩进每行。不支持左对齐。它还尝试检测可打印字符的平面列表并将它们输出为字符串。例如:
1> T = [{attributes,[[{id,age,1.50000},{mode,explicit},
{typename,"INTEGER"}], [{id,cho},{mode,explicit},{typename,'Cho'}]]},
{typename,'Person'},{tag,{'PRIVATE',3}},{mode,implicit}].
...
2> io:fwrite("~w~n", [T]).
[{attributes,[[{id,age,1.5},{mode,explicit},{typename,
[73,78,84,69,71,69,82]}],[{id,cho},{mode,explicit},{typena
me,'Cho'}]]},{typename,'Person'},{tag,{'PRIVATE',3}},{mode
,implicit}]
ok
3> io:fwrite("~62p~n", [T]).
[{attributes,[[{id,age,1.5},
{mode,explicit},
{typename,"INTEGER"}],
[{id,cho},{mode,explicit},{typename,'Cho'}]]},
{typename,'Person'},
{tag,{'PRIVATE',3}},
{mode,implicit}]
ok
字段宽度指定最大行长度。它默认为 80。精度指定术语的初始缩进。它默认为在对write/1或 format/1,2,3的同一调用中 打印在此行的字符数。例如,使用上面的T:
4> io:fwrite("Here T = ~62p~n", [T]).
Here T = [{attributes,[[{id,age,1.5},
{mode,explicit},
{typename,"INTEGER"}],
[{id,cho},
{mode,explicit},
{typename,'Cho'}]]},
{typename,'Person'},
{tag,{'PRIVATE',3}},
{mode,implicit}]
ok
从 Erlang/OTP 21.0 开始,值为 0的字段宽度可用于指定一行无限长,这意味着不插入换行符。例如:
5> io:fwrite("~0p~n", [lists:seq(1, 30)]).
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]
ok
当指定修饰符l时,不会检测可打印字符列表,例如:
6> S = [{a,"a"}, {b, "b"}],
io:fwrite("~15p~n", [S]).
[{a,"a"},
{b,"b"}]
ok
7> io:fwrite("~15lp~n", [S]).
[{a,[97]},
{b,[98]}]
ok
Unicode 翻译修饰符t指定如何处理 Latin-1 代码点范围之外的字符,在原子、字符串和二进制文件中。例如,打印一个包含字符 > 255 的原子:
8> io:fwrite("~p~n",[list_to_atom([1024])]).
'\x{400}'
ok
9> io:fwrite("~tp~n",[list_to_atom([1024])]).
'Ѐ'
ok
默认情况下,Erlang 仅将 Latin-1 范围内的字符列表检测为字符串,但+pc unicode 标志可用于更改此设置(有关详细信息,请参阅printable_range/0)。例如:
10> io:fwrite("~p~n",[[214]]).
"Ö"
ok
11> io:fwrite("~p~n",[[1024]]).
[1024]
ok
12> io:fwrite("~tp~n",[[1024]]).
[1024]
ok
but if Erlang was started with +pc unicode:
13> io:fwrite("~p~n",[[1024]]).
[1024]
ok
14> io:fwrite("~tp~n",[[1024]]).
"Ѐ"
ok
同样,如果指定了t 修饰符,则看起来像 UTF-8 编码字符串的二进制文件将使用二进制字符串语法输出:Similarly, binaries that look like UTF-8 encoded strings are output with the binary string syntax if the t modifier is specified:
15> io:fwrite("~p~n", [<<208,128>>]).
<<208,128>>
ok
16> io:fwrite("~tp~n", [<<208,128>>]).
<<"Ѐ"/utf8>>
ok
17> io:fwrite("~tp~n", [<<128,128>>]).
<<128,128>>
ok
W 以与~w相同的方式写入数据,但需要一个额外的参数,即打印术语的最大深度。低于此深度的任何内容都将替换为 ...。例如,使用上面的T:
8> io:fwrite("~W~n", [T,9]).
[{attributes,[[{id,age,1.5},{mode,explicit},{typename,...}],
[{id,cho},{mode,...},{...}]]},{typename,'Person'},
{tag,{'PRIVATE',3}},{mode,implicit}]
ok
如果达到最大深度,则无法在结果输出中读取。此外,元组中的 ,...形式表示元组中有更多元素,但这些元素低于打印深度。
P 以与~p相同的方式写入数据,但需要一个额外的参数,即打印术语的最大深度。低于此深度的任何内容都将替换为 ...,例如:
9> io:fwrite("~62P~n", [T,9]).
[{attributes,[[{id,age,1.5},{mode,explicit},{typename,...}],
[{id,cho},{mode,...},{...}]]},
{typename,'Person'},
{tag,{'PRIVATE',3}},
{mode,implicit}]
ok
B 以 2-36 为基数写入整数,默认基数为 10。负整数会打印前导破折号。
precision字段选择base,例如:
1> io:fwrite("~.16B~n", [31]).
1F
ok
2> io:fwrite("~.2B~n", [-19]).
-10011
ok
3> io:fwrite("~.36B~n", [5*36+35]).
5Z
ok
X 与B类似,但需要一个额外的参数,该参数是要在数字之前插入的前缀,但在前导破折号之后(如果有的话)。
1> io:fwrite("~X~n", [31,"10#"]).
10#31
ok
2> io:fwrite("~.16X~n", [-31,"0x"]).
-0x1F
ok
# 与B类似,但使用 Erlang 样式#分隔的基本前缀打印数字 。例子:
1> io:fwrite("~.10#~n", [31]).
10#31
ok
2> io:fwrite("~.16#~n", [-31]).
-16#1F
ok
b 与B类似,但打印小写字母。
x 像X,但打印小写字母。
+ 像#,但打印小写字母。
n 写一个新行。
i 忽略下一个term。