Skip to content

An OTP library to format term, for efficient. base on otp-23.2.4 io_lib.erl io_lib_format.erl

License

Notifications You must be signed in to change notification settings

ErlGameWorld/eFmt

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

eFmt

An OTP library to format term, for efficient base on otp-25.2.1

Build

$ 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

Available control sequences:

~ 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。


About

An OTP library to format term, for efficient. base on otp-23.2.4 io_lib.erl io_lib_format.erl

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages