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

28

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

例如,对于长度为4位数的整数4,输出应为“0004”而不是“4”。在Erlang中如何实现?

5个回答

42
在 Zed 的回答中增加一点解释: Erlang 格式规范 是:~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 表示换行。"

你可以在回答中添加解释,而不是添加另一个回答。这将有助于改进该问题并更好地帮助其他人。 - Coral Doe
2
@CoralDoe,无法像解释答案中所做的那样对答案进行评论格式化。 - Johnny

32

io:format("~4..0B~n", [Num]).


15

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


3

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:flatten(io_lib:format("~s", [Result]))将其转换为列表。


0
Eshell V12.0.3  (abort with ^G)
1> F = fun(Max, I)-> case Max - length(integer_to_list(I)) of X when X > 0 -> string:chars($0, X) ++ integer_to_list(I); _ -> I end    end. 
#Fun<erl_eval.43.40011524>
2> F(10, 22).
"0000000022"
3> F(3, 22345).
22345

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接