You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

199 lines
8.7 KiB

преди 4 години
преди 2 години
преди 4 години
преди 4 години
преди 2 години
преди 2 години
преди 2 години
  1. eFmt
  2. =====
  3. An OTP library to format term, for efficient base on otp-25.2.1
  4. Build
  5. -----
  6. $ rebar3 compile
  7. # 说明
  8. ## 格式
  9. ~F.P.PadModC 其中 C是唯一必填字段 F, P, Pad和Mod是可选的
  10. F是打印参数的字段宽度。负值表示参数在字段内左对齐,否则右对齐。如果未指定字段宽度,则使用所需的打印宽度。如果指定的字段宽度太小,则整个字段都用*字符填充。
  11. P是打印参数的精度。如果未指定精度,则使用默认值。精度的解释取决于控制序列。除非另有说明,参数within用于确定打印宽度。
  12. Pad是填充字符。这是用于填充参数的打印表示的字符,以使其符合指定的字段宽度和精度。只能指定一个填充字符,并且在适用的情况下,它用于字段宽度和精度。默认的填充字符是' '(空格)。
  13. Mod是控制序列修饰符。这是一个或多个改变数据解释的字符 。当前的修饰符是t,用于 Unicode 翻译,l,用于阻止p和P 检测可打印字符。
  14. 如果如果F、P或Pad是*字符,则Data中的下一个参数用作值。例如:io:fwrite("~*.*.0f~n",[9, 5, 3.14159265]). -> 003.14159
  15. 要将文字*字符用作Pad,它必须作为参数传递:io:fwrite("~*.*.*f~n",[9, 5, $*, 3.14159265]). -> **3.14159
  16. ## Available control sequences:
  17. ```
  18. ~ Character ~ is written.
  19. c 参数是一个被解释为 ASCII 代码的数字。精度是打印字符的次数,默认为字段宽度,而字段宽度又默认为 1. Example:
  20. 1> io:fwrite("|~10.5c|~-10.5c|~5c|~n", [$a, $b, $c]). -> | aaaaa|bbbbb |ccccc|
  21. 如果 Unicode 转换修饰符 ( t ) 有效,整数参数可以是代表有效 Unicode 代码点的任何数字,否则它是一个小于或等于 255 的整数,否则它被 16#FF 屏蔽:
  22. 2> io:fwrite("~tc~n",[1024]).
  23. \x{400}
  24. ok
  25. 3> io:fwrite("~c~n",[1024]).
  26. ^@
  27. ok
  28. f 参数是一个浮点数,写为 [-]ddd.ddd,其中精度是小数点后的位数。默认精度为 6,不能小于 1。
  29. e 参数是一个浮点数,写为 [-]d.ddde+-ddd,其中精度是写入的位数。默认精度为 6,不能小于 2。
  30. g 参数是一个浮点数,如果它 >= 0.1 且 < 10000.0 则写为f 否则以e格式写入精度是有效数字的个数默认为6不会<2如果float的绝对值不允许用f格式写成想要的有效位数也写成e格式
  31. s 使用字符串语法打印参数。参数是,如果不存在 Unicode 转换修饰符, 则为 iolist()、binary()或atom()。如果 Unicode 转换修饰符 ( t ) 有效,则参数为unicode:chardata(),这意味着二进制文件采用 UTF-8。打印的字符不带引号。该字符串首先按指定的精度截断,然后填充并对齐到指定的字段宽度。默认精度是字段宽度。此格式可用于打印任何对象并截断输出以适合指定字段:
  32. 1> io:fwrite("|~10w|~n", [{hey, hey, hey}]).
  33. |**********|
  34. ok
  35. 2> io:fwrite("|~10s|~n", [io_lib:write({hey, hey, hey})]).
  36. |{hey,hey,h|
  37. 3> io:fwrite("|~-10.8s|~n", [io_lib:write({hey, hey, hey})]).
  38. |{hey,hey |
  39. ok
  40. 如果未指定 Unicode 转换修饰符,则整数列表 > 255 被视为错误:
  41. 4> io:fwrite("~ts~n",[[1024]]).
  42. \x{400}
  43. ok
  44. 5> io:fwrite("~s~n",[[1024]]).
  45. ** exception error: bad argument
  46. in function io:format/3
  47. called as io:format(<0.53.0>,"~s~n",[[1024]])
  48. w 使用标准语法写入数据。这用于输出 Erlang 术语。如果原子包含嵌入的不可打印字符,则它们将打印在引号内。除非使用 Unicode 转换修饰符 ( t ) ,否则将转义大于 255 的原子字符。浮点数被准确打印为最短、正确舍入的字符串。
  49. p 以与~w相同的方式使用标准语法写入数据 ,但将打印表示长于一行的术语分成多行,并明智地缩进每行。不支持左对齐。它还尝试检测可打印字符的平面列表并将它们输出为字符串。例如:
  50. 1> T = [{attributes,[[{id,age,1.50000},{mode,explicit},
  51. {typename,"INTEGER"}], [{id,cho},{mode,explicit},{typename,'Cho'}]]},
  52. {typename,'Person'},{tag,{'PRIVATE',3}},{mode,implicit}].
  53. ...
  54. 2> io:fwrite("~w~n", [T]).
  55. [{attributes,[[{id,age,1.5},{mode,explicit},{typename,
  56. [73,78,84,69,71,69,82]}],[{id,cho},{mode,explicit},{typena
  57. me,'Cho'}]]},{typename,'Person'},{tag,{'PRIVATE',3}},{mode
  58. ,implicit}]
  59. ok
  60. 3> io:fwrite("~62p~n", [T]).
  61. [{attributes,[[{id,age,1.5},
  62. {mode,explicit},
  63. {typename,"INTEGER"}],
  64. [{id,cho},{mode,explicit},{typename,'Cho'}]]},
  65. {typename,'Person'},
  66. {tag,{'PRIVATE',3}},
  67. {mode,implicit}]
  68. ok
  69. 字段宽度指定最大行长度。它默认为 80。精度指定术语的初始缩进。它默认为在对write/1或 format/1,2,3的同一调用中 打印在此行的字符数。例如,使用上面的T:
  70. 4> io:fwrite("Here T = ~62p~n", [T]).
  71. Here T = [{attributes,[[{id,age,1.5},
  72. {mode,explicit},
  73. {typename,"INTEGER"}],
  74. [{id,cho},
  75. {mode,explicit},
  76. {typename,'Cho'}]]},
  77. {typename,'Person'},
  78. {tag,{'PRIVATE',3}},
  79. {mode,implicit}]
  80. ok
  81. 从 Erlang/OTP 21.0 开始,值为 0的字段宽度可用于指定一行无限长,这意味着不插入换行符。例如:
  82. 5> io:fwrite("~0p~n", [lists:seq(1, 30)]).
  83. [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]
  84. ok
  85. 当指定修饰符l时,不会检测可打印字符列表,例如:
  86. 6> S = [{a,"a"}, {b, "b"}],
  87. io:fwrite("~15p~n", [S]).
  88. [{a,"a"},
  89. {b,"b"}]
  90. ok
  91. 7> io:fwrite("~15lp~n", [S]).
  92. [{a,[97]},
  93. {b,[98]}]
  94. ok
  95. Unicode 翻译修饰符t指定如何处理 Latin-1 代码点范围之外的字符,在原子、字符串和二进制文件中。例如,打印一个包含字符 > 255 的原子:
  96. 8> io:fwrite("~p~n",[list_to_atom([1024])]).
  97. '\x{400}'
  98. ok
  99. 9> io:fwrite("~tp~n",[list_to_atom([1024])]).
  100. 'Ѐ'
  101. ok
  102. 默认情况下,Erlang 仅将 Latin-1 范围内的字符列表检测为字符串,但+pc unicode 标志可用于更改此设置(有关详细信息,请参阅printable_range/0)。例如:
  103. 10> io:fwrite("~p~n",[[214]]).
  104. "Ö"
  105. ok
  106. 11> io:fwrite("~p~n",[[1024]]).
  107. [1024]
  108. ok
  109. 12> io:fwrite("~tp~n",[[1024]]).
  110. [1024]
  111. ok
  112. but if Erlang was started with +pc unicode:
  113. 13> io:fwrite("~p~n",[[1024]]).
  114. [1024]
  115. ok
  116. 14> io:fwrite("~tp~n",[[1024]]).
  117. "Ѐ"
  118. ok
  119. 同样,如果指定了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:
  120. 15> io:fwrite("~p~n", [<<208,128>>]).
  121. <<208,128>>
  122. ok
  123. 16> io:fwrite("~tp~n", [<<208,128>>]).
  124. <<"Ѐ"/utf8>>
  125. ok
  126. 17> io:fwrite("~tp~n", [<<128,128>>]).
  127. <<128,128>>
  128. ok
  129. W 以与~w相同的方式写入数据,但需要一个额外的参数,即打印术语的最大深度。低于此深度的任何内容都将替换为 ...。例如,使用上面的T:
  130. 8> io:fwrite("~W~n", [T,9]).
  131. [{attributes,[[{id,age,1.5},{mode,explicit},{typename,...}],
  132. [{id,cho},{mode,...},{...}]]},{typename,'Person'},
  133. {tag,{'PRIVATE',3}},{mode,implicit}]
  134. ok
  135. 如果达到最大深度,则无法在结果输出中读取。此外,元组中的 ,...形式表示元组中有更多元素,但这些元素低于打印深度。
  136. P 以与~p相同的方式写入数据,但需要一个额外的参数,即打印术语的最大深度。低于此深度的任何内容都将替换为 ...,例如:
  137. 9> io:fwrite("~62P~n", [T,9]).
  138. [{attributes,[[{id,age,1.5},{mode,explicit},{typename,...}],
  139. [{id,cho},{mode,...},{...}]]},
  140. {typename,'Person'},
  141. {tag,{'PRIVATE',3}},
  142. {mode,implicit}]
  143. ok
  144. B 以 2-36 为基数写入整数,默认基数为 10。负整数会打印前导破折号。
  145. precision字段选择base,例如:
  146. 1> io:fwrite("~.16B~n", [31]).
  147. 1F
  148. ok
  149. 2> io:fwrite("~.2B~n", [-19]).
  150. -10011
  151. ok
  152. 3> io:fwrite("~.36B~n", [5*36+35]).
  153. 5Z
  154. ok
  155. X 与B类似,但需要一个额外的参数,该参数是要在数字之前插入的前缀,但在前导破折号之后(如果有的话)。
  156. 1> io:fwrite("~X~n", [31,"10#"]).
  157. 10#31
  158. ok
  159. 2> io:fwrite("~.16X~n", [-31,"0x"]).
  160. -0x1F
  161. ok
  162. # 与B类似,但使用 Erlang 样式#分隔的基本前缀打印数字 。例子:
  163. 1> io:fwrite("~.10#~n", [31]).
  164. 10#31
  165. ok
  166. 2> io:fwrite("~.16#~n", [-31]).
  167. -16#1F
  168. ok
  169. b 与B类似,但打印小写字母。
  170. x 像X,但打印小写字母。
  171. + 像#,但打印小写字母。
  172. n 写一个新行。
  173. i 忽略下一个term。