如何在erlang中格式化整数的扁平字符串?

Reb*_*itz 9 string format erlang integer

在erlang中,我想格式化一个包含整数的字符串,我希望将结果展平.但我明白了:

io_lib:format("sdfsdf ~B", [12312]).                 
[115,100,102,115,100,102,32,"12312"]
Run Code Online (Sandbox Code Playgroud)

我可以通过使用下面的代码获得所需的结果,但它真的不优雅.

lists:flatten(io_lib:format("sdfsdf ~B", [12312])).
"sdfsdf 12312"
Run Code Online (Sandbox Code Playgroud)

是否有更好的格式化字符串,其中包含整数,以便它们是平的?理想情况下,只使用一个功能?

Ada*_*erg 6

您可以lists:flatten/1像在示例中一样使用平面列表.

如果你能接受二进制文件,那就list_to_binary/1非常有效:

1> list_to_binary(io_lib:format("sdfsdf ~B", [12312])).
<<"sdfsdf 12312">>
Run Code Online (Sandbox Code Playgroud)

但是,问一下为什么你需要一个平面列表.如果它只是化妆品,你不需要它.io:format/1,2,3和大多数其他端口函数(gen_tcp等)接受所谓的深IO列表(带有字符和二进制文件的嵌套列表):

2> io:format([115,100,102,115,100,102,32,"12312"]).
sdfsdf 12312ok
Run Code Online (Sandbox Code Playgroud)


Dan*_*una 5

io_lib:format 返回深度列表有一个效率原因。基本上它节省了对列表的调用:展平。

问问自己为什么要扁平化列表。如果您要打印列表或将其发送到端口或将其写入文件,所有这些操作都会处理深度列表。

如果出于某种原因你确实需要一个扁平化的列表,那就扁平化它吧。或者,如果您认为重要,您可以创建自己的 my_io_lib:format 来返回扁平列表。

(如果您只想出于调试原因展平列表,则可以使用 ~s 打印字符串,或者在名为 的 erlang 模块中创建展平器user_default。如下所示:

 -module(user_default).
 -compile(export_all).
 %% either this:
 fl(String) ->
    lists:flatten(String).
 %% or this:
 pp(String) ->
     io:format("~s~n", [String]).
Run Code Online (Sandbox Code Playgroud)

然后你可以在 Erlang shell 中使用 fl/1 和 print/1 (当然,只要 user_default.beam 在你的路径中)。