【发布时间】:2010-11-18 02:55:40
【问题描述】:
我需要将一个整数的输出填充到给定的长度。
例如,长度为 4 位,整数 4 的输出是“0004”而不是“4”。如何在 Erlang 中做到这一点?
【问题讨论】:
标签: formatting erlang
我需要将一个整数的输出填充到给定的长度。
例如,长度为 4 位,整数 4 的输出是“0004”而不是“4”。如何在 Erlang 中做到这一点?
【问题讨论】:
标签: formatting erlang
为 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 是新行。
【讨论】:
io:format("~4..0B~n", [Num]).
【讨论】:
string:right(integer_to_list(4), 4, $0).
【讨论】:
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])) 将其转换为列表。)
【讨论】:
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
【讨论】: