Erlangとiolist()

io:format/2みたいな書式指定の出力を、printfに対するsprintfのように、文字列を作るために使いたい! というときには io_lib:format/2が使えます。

16> io_lib:format("~s", ["ABCDE"]).
["ABCDE"]
17> io_lib:format("~10s", ["ABCDE"]).
[[[32,"  ",32,32],65,66,67,68,69]]
18> 

2個目は何が起きているの?何か悪いことした? と思うかもしれませんが(私もついさっきまではそう思っていました)、flattenするときちんと期待通りのものが出ていることが分かります。

18> lists:flatten(io_lib:format("~10s", ["ABCDE"])).
"     ABCDE"
19> 

How to format a flat string with integers in it in erlang? - Stack Overflowによると、気にせずそのまま文字列として使っていいよ、と読めます。ただこの状態だと、string:len/1やlength/1で文字数を得ることができないよねえ...と思ったら、これもFAQに相当するもののようで、Erlang io:format to stringによると、iolist_size/1 が使えるようです。

19> L = io_lib:format("~10s", ["ABCDE"]).
[[[32,"  ",32,32],65,66,67,68,69]]
20> length(L).
1
21> string:len(L).
1
22> iolist_size(L).
10
23> 

めでたしめでたし...なのでしょうか? なんとなく取った先からlists:flatten/1したいという欲求に抗えない気持です。
なお、iolist_size/1 にただの文字列(string())を与えても問題ないようです。

23> iolist_size("ABCDE").
5
24> 

まだまだ分からないことがたくさんですね。という感想は、そんなことも知らなかったのか、という指摘への予防線としては何の威力もありませんね。