【发布时间】:2011-05-11 20:26:02
【问题描述】:
我正在尝试根据列表生成格式化字符串:
[{"Max", 18}, {"Peter", 25}]
到一个字符串:
"(Name: Max, Age: 18), (Name: Peter, Age: 35)"
【问题讨论】:
-
你想对字符串做什么?
我正在尝试根据列表生成格式化字符串:
[{"Max", 18}, {"Peter", 25}]
到一个字符串:
"(Name: Max, Age: 18), (Name: Peter, Age: 35)"
【问题讨论】:
第一步是制作一个可以将您的 {Name, Age} 元组转换为列表的函数:
format_person({Name, Age}) ->
lists:flatten(io_lib:format("(Name: ~s, Age: ~b)", [Name, Age])).
接下来就是简单的将这个函数应用于列表中的每个元素,然后将它们连接在一起。
format_people(People) ->
string:join(lists:map(fun format_person/1, People), ", ").
扁平化的原因是 io_lib 返回的是 iolist 而不是扁平化列表。
【讨论】:
string:join([ io_lib:format("(Name: ~s, Age: ~b)", [Name,Age]) || {Name,Age} <- People ], ", ") 假设是 a) string:join/2 适用于 io_lib:format/2 输出,它在我的测试中执行,并且 b ) 您的输出函数可以将生成的未展平的嵌套字符列表作为字符串处理(它们确实应该这样做)。
如果性能很重要,您可以使用此解决方案:
format([]) -> [];
format(List) ->
[[_|F]|R] = [ [", ","(Name: ",Name,", Age: ",integer_to_list(Age)|")"]
|| {Name, Age} <- List ],
[F|R].
但请记住,它返回 io_list(),因此如果您想查看结果,请使用 lists:flatten/1。这是在 Erlang 中编写非常高效的字符串操作的一种方式,但只有在性能远比可读性和可维护性更重要时才使用它。
【讨论】:
一个简单但缓慢的方法:
string:join([lists:flatten(io_lib:format("(~s: ~p)", [Key, Value])) || {Key,Value} <- [{"Max", 18}, {"Peter", 25}]], ", ").
【讨论】:
string:join/2、lists:flatten/1 和io_lib:format/2 都被认为不太有效。
是 JSON 吗?
使用一些已经编写好的模块,例如 mochiweb。
【讨论】: