Erlang: Formatando e imprimindo
É, pois é. A gente costuma começar com o “Hello World” e eu simplesmente esqueci. Se bem que não faz diferença, mesmo, já que há anos eu não faço “Hello Worlds” para começar a aprender linguagens de programação…
O que vamos ver hoje são os caracteres de formatação de io:format/2.
~n
Imprime o caracter de “nova linha”.
Lembre-se que em sistemas unix-like, “nova linha” é só “\n”. No Windows e derivados é “\r\n” e no Mac, se não me engano, é “\n\r”. Por isso é bom sempre usar ~n quando precisar quebrar linhas.
~c
Imprime inteiros, convertendo-os para o equivalente em ASCII:
4ᐳ io:format("[~c]~n", [$a]).
[a]
ok
5ᐳ io:format("[~10c]~n", [$a]).
[aaaaaaaaaa]
ok
6ᐳ io:format("[~10.1c]~n", [$a]).
[ a]
ok
7ᐳ io:format("[~-10.1c]~n", [$a]).
[a ]
ok
8ᐳ
(Lembre-se: $a já significa “o valor inteiro do caracter ‘a’ na tabela ASCII”. Na hora de imprimir, estamos “desconvertendo-o”).
~f
Imprime floats:
9ᐳ io:format("[~f]~n", [99.123456789]).
[99.123457]
ok
10ᐳ io:format("[~10f]~n", [99.123456789]).
[ 99.123457]
ok
11ᐳ io:format("[~15f]~n", [99.123456789]).
[ 99.123457]
ok
12ᐳ io:format("[~15.3f]~n", [99.123456789]).
[ 99.123]
ok
13ᐳ io:format("[~-15.3f]~n", [99.123456789]).
[99.123 ]
ok
Curiosamente, imprimir um float sem parâmetro nenhum só imprime até a sétima casa decimal…
~e
Imprime float com aquela notação científica que eu nunca usei em lugar algum:
17ᐳ io:format("[~e]~n", [99.123456789]).
[9.91235e+1]
ok
~g
Escolhe se é melhor formatar o número como se fosse um ~f ou como um ~e:
18ᐳ io:format("[~g]~n", [99.123456789]).
[99.1235]
ok
19ᐳ io:format("[~g]~n", [9999999999999.123456789]).
[1.00000e+13]
ok
~s
Imprime como string:
22ᐳ io:format("[~15s]~n", ["Teste"]).
[ Teste]
ok
23ᐳ io:format("[~-15s]~n", ["Teste"]).
[Teste ]
ok
25ᐳ io:format("[~-15.2s]~n", ["Teste"]).
[Te ]
ok
~w
Imprime com a sintaxe do Erlang:
26ᐳ io:format("[~w]~n", ["Teste"]).
[[84,101,115,116,101]]
ok
27ᐳ io:format("[~w]~n", [10]).
[10]
ok
28ᐳ io:format("[~w]~n", [ᐸᐸ10ᐳᐳ]).
[ᐸᐸ10ᐳᐳ]
ok
Viu, na linha 26, como as strings em Erlang são apenas listas de caracteres?
~p
Igual o ~w, mas, caso a linha fique muito grande, ele a quebra e formata da melhor maneira possível.
~B
Imprime inteiros, mas você pode escolher a base:
35ᐳ io:format("[~.2B]~n", [$a]).
[1100001]
ok
36ᐳ io:format("[~.16B]~n", [$a]).
[61]
ok
37ᐳ io:format("[~.8B]~n", [$a]).
[141]
ok
38ᐳ io:format("[~.10B]~n", [$a]).
[97]
ok
Resumo
- Sempre use ~n quando quiser quebrar linhas, para que seu código seja portável.
- Quando não precisar formatar nada, use io:put_chars/1.
Este artigo foi originalmente escrito em 05/12/2014.