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

时间:2011-06-28 07:51:12

标签: string erlang integer format

在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"

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

2 个答案:

答案 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当然在你的路径中)。)