Как отформатировать число с отступом в Erlang - PullRequest
26 голосов
/ 09 августа 2009

Мне нужно дополнить вывод целого числа до заданной длины.

Например, при длине 4 цифры выходное значение целого числа 4 равно «0004» вместо «4». Как я могу сделать это в Erlang?

Ответы [ 4 ]

39 голосов
/ 27 января 2012

добавив немного объяснения к ответу Зеда:

Спецификация формата 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 - новая строка.

31 голосов
/ 09 августа 2009

io: формат ("~ 4..0B ~ n", [Num]).

12 голосов
/ 10 августа 2009

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

2 голосов
/ 27 августа 2014

Проблема с 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 ", [Результат])) чтобы преобразовать его в список.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...