如何在Erlang中将整数转换为字符串?

62

我知道在Erlang中使用字符串可能很昂贵。那么我如何将"5"转换为5

是否有类似于io:format("~p",[5])的东西可以返回格式化的字符串而不是打印到流中?


1
避免不惜一切代价?你从哪里得到这个想法的?虽然有一些性能问题和其他烦恼,但它们仍然是核心数据类型和字符串的默认选择。 - cthulahoops
1
我是半开玩笑地说的。如果我坚信你永远不应该使用它们,我就不会问这个问题了。 另一方面,在我看来,将它们描述为“核心数据类型”可能有点牵强。 - collapsinghrung
1
在Erlang中,字符串是一个列表。它是核心数据类型之一,与二进制或原子相同。 - Worker
5个回答

157

还有integer_to_list/1,它可以完全满足你的要求,而不会显得丑陋。


我认为你指的是list_to_integer/1和list_to_float/1,因为他试图将字符串转换为数字。此外,这些函数的文档“很难找到”,因为它们都是Erlang模块的一部分,你需要知道去哪里查找。 - Gordon Guthrie
11
他正试图将数字5转换为字符串"5"。也就是将整数转换为字符串。 - Adam Lindberg
7
在Erlang中,字符串是列表。 - Vukasin Toroman

31

字符串是一串字符列表:

9> integer_to_list(123).  
"123"

16
以下可能不是最简洁的方法,但它可以工作:
1> lists:flatten(io_lib:format("~p", [35365])).
"35365"

编辑:我发现以下函数非常有用:

%% string_format/2
%% Like io:format except it returns the evaluated string rather than write
%% it to standard output.
%% Parameters:
%%   1. format string similar to that used by io:format.
%%   2. list of values to supply to format string.
%% Returns:
%%   Formatted string.
string_format(Pattern, Values) ->
    lists:flatten(io_lib:format(Pattern, Values)).

编辑2(回应评论):上述函数来自我写的一个小程序,旨在学习Erlang。我当时正在寻找一个字符串格式化函数,并发现erl中的io_lib:format/2的行为令人感到反直觉,例如:

1> io_lib:format("2 + 2 = ~p", [2+2]).
[50,32,43,32,50,32,61,32,"4"]

当时,我不知道@archaelus提到的输出设备的“自动平铺”行为,因此得出结论上述行为并不是我想要的。

今晚,我回到这个程序并用io_lib:format替换了以上调用string_format函数的部分。唯一导致的问题是一些EUnit测试失败了,因为它们期望一个平整的字符串。这些问题很容易修复。

我同意@gleber和@womble的观点,对于将整数转换为字符串,使用这个函数可能过于复杂了。如果只需要这样做,可以使用integer_to_list/1。保持简单!


27
完全没有必要使用 io_lib:format/2 来完成这个简单的任务,integer_to_list/1 已经足够了。 - gleber
2
此外,将结果iolist展平通常是浪费的。套接字/端口/文件/Io设备在输出时都会展平,因此自己展平是多余的。 - archaelus
1
integer_to_list/1 对于标题中的问题已经足够了,但这也很好地回答了我的“您能生成带有插入数字的格式化字符串吗?”子问题... - collapsinghrung
3
很遗憾,这条回答被选为最佳答案,但womble的回答才是正确的。 - Rodrigue

4
作为一个附注,如果你需要处理浮点数的字符串表示,你应该看一下Bob Ippolito在mochinum上所做的工作。

2

lists:concat([Number]) 也可以使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接