Проблема с io: format заключается в том, что если ваше целое число не подходит, вы получите звездочки:
> io:format("~4..0B~n", [1234]).
1234
> io:format("~4..0B~n", [12345]).
****
Проблема со строкой : право состоит в том, что она отбрасывает символы, которые не подходят:
> 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 , чтобы преобразовать результат в двоичный файл, или вы можете использовать списки: flatten ( io_lib: format ("~ s ", [Результат])) чтобы преобразовать его в список.)