【问题标题】:How to format a number with padding in Erlang如何在 Erlang 中使用填充格式化数字
【发布时间】:2010-11-18 02:55:40
【问题描述】:

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

例如,长度为 4 位,整数 4 的输出是“0004”而不是“4”。如何在 Erlang 中做到这一点?

【问题讨论】:

    标签: formatting erlang


    【解决方案1】:

    为 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 是新行。

    【讨论】:

    • 您可以为该答案添加解释,而不是添加另一个答案。这将有助于改善该问题并为其他人提供更多帮助。
    • @CoralDoe 无法按照解释答案中的方式将 cmets 格式化为答案。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        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])) 将其转换为列表。)

        【讨论】:

          【解决方案5】:
          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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-07-09
            • 2019-08-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多