私は知っています、Erlangの文字列はどんな犠牲を払っても避けるべきです...
しかし、私がそれをしていない場合、どのように5から「5」を生成しますか?
特に、io:format( "〜p"、[5])など、ストリームに出力する代わりにフォーマットされた文字列を返すものはありますか?
以下はおそらく最も近い方法ではありませんが、機能します:
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)).
EDIT 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が言及した出力デバイスの「自動平坦化」動作に気がつかなかったため、上記の動作は私が望んでいたものではないと結論付けました。
今晩、私はこのプログラムに戻り、上記のstring_format
関数の呼び出しをio_lib:format
に置き換えました。これが引き起こした唯一の問題は、フラット化された文字列を期待していたために失敗したいくつかのEUnitテストでした。これらは簡単に修正されました。
@gleberと@wombleには、この関数を使用すると整数を文字列に変換するのがやり過ぎだということに同意します。必要なだけの場合は、integer_to_list/1
を使用します。接吻!
また、integer_to_list/1
もあります。
文字列はリストです:
9> integer_to_list(123).
"123"
list:concat([Number])。動作します。