在erlang中,我想格式化一个带有整数的字符串,我想要将结果弄平。但我明白了:
io_lib:format("sdfsdf ~B", [12312]).
[115,100,102,115,100,102,32,"12312"]
我可以使用下面的代码获得所需的结果,但实际上并不优雅。
lists:flatten(io_lib:format("sdfsdf ~B", [12312])).
"sdfsdf 12312"
是否有更好的格式化字符串,其中包含整数,以便它们是平的?理想情况下,只使用一个函数?
答案 0 :(得分:6)
您使用lists:flatten/1
平铺了一个列表,就像您在示例中所做的那样。
如果您可以接受二进制文件,list_to_binary/1
非常有效:
1> list_to_binary(io_lib:format("sdfsdf ~B", [12312])).
<<"sdfsdf 12312">>
但是,问一下为什么你需要一个平面列表。如果它只是化妆品,你不需要它。 io:format/1,2,3
和大多数其他端口函数(gen_tcp
等)接受所谓的深IO列表(带有字符和二进制文件的嵌套列表):
2> io:format([115,100,102,115,100,102,32,"12312"]).
sdfsdf 12312ok
答案 1 :(得分:2)
有一个效率原因,io_lib:format返回深层列表。基本上它会保存对列表的调用:flatten。
问自己为什么你希望列表变平。如果要打印列表或将其发送到端口或将其写入文件,则所有这些操作都会处理深层列表。
如果由于某种原因你真的需要一个扁平的列表,那么就把它弄平。或者,您可以创建自己的my_io_lib:格式,如果您认为它很重要,则返回展平列表。
(如果你只是想因为调试原因而压扁列表,那么要么用~s打印你的字符串,要么在名为user_default
的erlang模块中创建一个flattener。这样的东西:
-module(user_default).
-compile(export_all).
%% either this:
fl(String) ->
lists:flatten(String).
%% or this:
pp(String) ->
io:format("~s~n", [String]).
然后你可以在Erlang shell中使用fl / 1和print / 1(只要user_default.beam当然在你的路径中)。)