如何在Erlang中使用填充格式化数字

时间:2009-08-09 18:02:38

标签: formatting erlang

我需要将整数的输出填充到给定的长度。

例如,长度为4位,整数4的输出为“0004”而不是“4”。我怎么能在Erlang中做到这一点?

4 个答案:

答案 0 :(得分:39)

为Zed的回答添加了一些解释:

Erlang Format specification是:〜F.P.PadModC。

"~4..0B~n"转换为:

 ~F. = ~4.  (Field width of 4)
  P. =   .  (no Precision specified)
Pad  =  0   (Pad with zeroes)
Mod  =      (no control sequence Modifier specified)
  C  =  B   (Control sequence B = integer in default base 10)

~n是新行。

答案 1 :(得分:31)

io:format(“~4..0B~n”,[Num])。

答案 2 :(得分:12)

string:right(integer_to_list(4), 4, $0).

答案 3 :(得分:2)

io:format的问题是,如果你的整数不合适,你会得到星号:

> io:format("~4..0B~n", [1234]).
1234
> io:format("~4..0B~n", [12345]).
****

string:right的问题在于它丢弃了不合适的字符:

> string:right(integer_to_list(1234), 4, $0).
"1234"
> string:right(integer_to_list(12345), 4, $0).
"2345"

我还没有找到一个像我期望的那样行事的库模块(即打印我的号码,即使它不适合填充),所以我编写了自己的格式化功能:

%%------------------------------------------------------------------------------
%% @doc Format an integer with a padding of zeroes
%% @end
%%------------------------------------------------------------------------------
-spec format_with_padding(Number :: integer(),
                          Padding :: integer()) -> iodata().
format_with_padding(Number, Padding) when Number < 0 ->
    [$- | format_with_padding(-Number, Padding - 1)];
format_with_padding(Number, Padding) ->
    NumberStr = integer_to_list(Number),
    ZeroesNeeded = max(Padding - length(NumberStr), 0),
    [lists:duplicate(ZeroesNeeded, $0), NumberStr].

(您可以使用iolist_to_binary/1将结果转换为二进制,也可以使用lists:flattenio_lib:format(“〜s”,[Result]))将其转换为列表)。