2011-06-28 32 views
9

在erlang中,我想使用整數格式化一個字符串,我希望結果變平。但我得到這個:如何使用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" 

是否有更好的格式化字符串與他們的整數,使他們是平坦的?理想情況下,只使用一個函數?

回答

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 
2

有一個效率原因io_lib:格式返回深列表。基本上它節省了對列表的呼叫:扁平化。

問問自己爲什麼你想列表展平。如果您要打印列表或將其發送到端口或將其寫入文件,則所有這些操作都會處理深層列表。

如果你確實需要一個扁平化的列表出於某種原因,那麼就扁平化它。或者,如果您認爲重要,則可以創建自己的my_io_lib:格式來返回平展列表。

(如果你只是想壓平列表進行調試的原因,然後要麼〜S打印你的字符串,或命名爲user_default事情是這樣的一個Erlang模塊中創建一個拼合:

-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在你的路徑中)。)