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?
-
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/2withinerlcounter-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_formatfunction above withio_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!gleber : There is absolutely no need to use `io_lib:format/2` for this simple task. `integer_to_list/1` is enough.archaelus : Also, flattening the resulting iolist is normally wasteful. Sockets/Ports/Files/IoDevices all flatten on output, so flattening yourself is redundant.collapsinghrung : 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... -
There's also
integer_to_list/1, which does exactly what you want, without the ugliness.Gordon Guthrie : 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.Adam Lindberg : He's trying to convert 5 to "5". Thus, integer to string.ErJab : integer_to_list/1 is right.womble : @Gordon: title of the question is "convert an integer TO A STRING"... -
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.
-
A string is a list:
9> integer_to_list(123). "123"
0 comments:
Post a Comment