2010-11-18 30 views
3

我試圖基於名單上的格式化字符串:生成字符串從列表中二郎

[{"Max", 18}, {"Peter", 25}] 

字符串:

"(Name: Max, Age: 18), (Name: Peter, Age: 35)" 
+2

你想用字符串做什麼? – Zed 2010-11-18 14:20:33

回答

8

第一步是創建一個可以將{Name,Age}元組轉換爲列表的函數:

下一部分簡單地將此函數應用於列表中的每個元素,然後將它們連接在一起。

format_people(People) -> 
    string:join(lists:map(fun format_person/1, People), ", "). 

壓扁的原因是io_lib返回一個iolist而不是一個扁平列表。

+0

你是一羣火人......只是讀了你的回覆,而且它也很堅固...... :) – 2010-11-21 13:35:17

+1

或者你可以在兩個假設下將它縮短爲一行:'string:join([io_lib:format( 「(Name:〜s,Age:〜b)」,[Name,Age])|| {Name,Age} < - People],「,」)'假設是a)'string:join/2'可以在我的測試中使用'io_lib:format/2'輸出,並且b)你的輸出函數可以處理由字符串產生的unflattened嵌套字符列表(他們真的應該這樣做)。 – ndim 2010-11-29 01:09:23

+0

哦,是的,當然,有更短的路。我的意圖是展示一個簡單的實現。 – 2010-11-29 08:23:37

0

一個簡單但較慢的方法:

string:join([lists:flatten(io_lib:format("(~s: ~p)", [Key, Value])) || {Key,Value} <- [{"Max", 18}, {"Peter", 25}]], ", "). 
+0

你爲什麼覺得這很慢? – 2010-11-18 10:51:33

+0

@Peer Stritzinger:因爲所有'string:join/2','lists:flatten/1'和'io_lib:format/2'都不被認爲太有效。 – 2010-11-30 13:52:13

0

是JSON嗎?

使用例如mochiweb中已經編寫的一些模塊。

0

如果性能是很重要的,你可以使用此解決方案:

format([]) -> []; 
format(List) -> 
    [[_|F]|R] = [ [", ","(Name: ",Name,", Age: ",integer_to_list(Age)|")"] 
       || {Name, Age} <- List ], 
    [F|R]. 

但請記住,它返回io_list(),所以如果你想看到的結果,用lists:flatten/1。如何在Erlang中編寫非常有效的字符串操作,但只有在性能比可讀性和可維護性更重要時才使用它。