Tôi cần phải pad đầu ra của một số nguyên đến một độ dài nhất định. Ví dụ, với độ dài 4 chữ số, đầu ra của số nguyên là "0004" thay vì "4". Làm thế nào tôi có thể làm điều này trong Erlang?Cách định dạng một số có đệm trong Erlang
24
A
Trả lời
30
io: định dạng ("~ 4..0B ~ n", [Num]).
12
string:right(integer_to_list(4), 4, $0).
35
thêm một chút giải thích câu trả lời của Zed:
Erlang Format specification là: ~ F.P.PadModC.
"~4..0B~n"
dịch để:
~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)
và ~n
là dòng mới.
2
Vấn đề với io:format là nếu số nguyên của bạn không phù hợp, bạn sẽ có dấu hoa thị:
> io:format("~4..0B~n", [1234]).
1234
> io:format("~4..0B~n", [12345]).
****
Vấn đề với string:right là nó ném đi những nhân vật không phù hợp:
> string:right(integer_to_list(1234), 4, $0).
"1234"
> string:right(integer_to_list(12345), 4, $0).
"2345"
Tôi chưa tìm thấy mô-đun thư viện hoạt động như tôi mong đợi (ví dụ: in số của tôi ngay cả khi nó không vừa với đệm), vì vậy tôi đã viết chức năng định dạng của riêng mình:
%%------------------------------------------------------------------------------
%% @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].
(Bạn có thể sử dụng iolist_to_binary/1 để chuyển đổi kết quả nhị phân, hoặc bạn có thể sử dụng lists:flatten (io_lib:format ("~ s", [Kết quả])) để chuyển đổi nó vào một danh sách.)
Bạn có thể thêm lời giải thích cho câu trả lời đó thay vì thêm một câu trả lời khác. Điều này sẽ giúp cải thiện câu hỏi đó và giúp đỡ người khác nhiều hơn. –
@CoralDoe không thể định dạng nhận xét cho câu trả lời theo cách được thực hiện trong câu trả lời giải thích. – Stas