views:

3904

answers:

4

I know, Erlang strings should be avoided at all costs...

but if I'm not doing that, how do I produce "5" from 5?

in particular, is there anything like io:format("~p",[5]) that would return a formatted string instead of printing to a stream?

+3  A: 

The following is probably not the neatest way, but it works:

1> lists:flatten(io_lib:format("~p", [35365])).
"35365"

EDIT: I've found that the following function comes in useful:

%% 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)).

EDIT 2 (in response to comments): the above function came from a small program I wrote a while back to learn Erlang. I was looking for a string-formatting function and found the behaviour of io_lib:format/2 within erl counter-intuitive, for example:

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

At the time, I was unaware of the 'auto-flattening' behaviour of output devices mentioned by @archaelus and so concluded that the above behaviour wasn't what I wanted.

This evening, I went back to this program and replaced calls to the string_format function above with io_lib:format. The only problems this caused were a few EUnit tests that failed because they were expecting a flattened string. These were easily fixed.

I agree with @gleber and @womble that using this function is overkill for converting an integer to a string. If that's all you need, use integer_to_list/1. KISS!

Pourquoi Litytestdata
There is absolutely no need to use `io_lib:format/2` for this simple task. `integer_to_list/1` is enough.
gleber
Also, flattening the resulting iolist is normally wasteful. Sockets/Ports/Files/IoDevices all flatten on output, so flattening yourself is redundant.
archaelus
integer_to_list/1 is enough for the headlined question, but this does neatly answer my "can you produce formatted strings with interpolated numbers" subquestion...
collapsinghrung
+28  A: 

There's also integer_to_list/1, which does exactly what you want, without the ugliness.

womble
I think you mean list_to_integer/1 and list_to_float/1 as he's trying to go from a string to a number.Also the documentation for these functions is 'hard to find' as they are both part of the Erlang module and you need to know to look there.
Gordon Guthrie
He's trying to convert 5 to "5". Thus, integer to string.
Adam Lindberg
integer_to_list/1 is right.
ErJab
@Gordon: title of the question is "convert an integer TO A STRING"...
womble
+2  A: 

As an aside if you ever need to deal with the string representation of floats you should look at the work that Bob Ippolito has done on mochinum.

Gordon Guthrie
+4  A: 

A string is a list:

9> integer_to_list(123).  
"123"
Thomas