代码之家  ›  专栏  ›  技术社区  ›  Houda Jimmie R. Houts

以人类可读的方式格式化字节大小的更简单方法?

  •  2
  • Houda Jimmie R. Houts  · 技术社区  · 7 年前

    float_as_string() 部分

    human_filesize(Size) ->
      KiloByte = 1024,
      MegaByte = KiloByte * 1024,
      GigaByte = MegaByte * 1024,
      TeraByte = GigaByte * 1024,
      PetaByte = TeraByte * 1024,
    
      human_filesize(Size, [
        {PetaByte, "PB"},
        {TeraByte, "TB"},
        {GigaByte, "GB"},
        {MegaByte, "MB"},
        {KiloByte, "KB"}
      ]).
    
    
    human_filesize(Size, []) ->
      integer_to_list(Size) ++ " Byte";
    human_filesize(Size, [{Block, Postfix}|List]) ->
      case Size >= Block of
        true ->
            float_as_string(Size / Block) ++ " " ++ Postfix;
        false ->
            human_filesize(Size, List)
    end.
    
    float_as_string(Float) ->
      Integer = trunc(Float), % Part before the .
      NewFloat = 1 + Float - Integer, % 1.<part behind>
      FloatString = float_to_list(NewFloat), % "1.<part behind>"
      integer_to_list(Integer) ++ string:sub_string(FloatString, 2, 4).
    

    1 回复  |  直到 14 年前
        1
  •  5
  •   Zed    16 年前
    human_filesize(Size) -> human_filesize(Size, ["B","KB","MB","GB","TB","PB"]).
    
    human_filesize(S, [_|[_|_] = L]) when S >= 1024 -> human_filesize(S/1024, L);
    human_filesize(S, [M|_]) ->
        io_lib:format("~.2f ~s", [float(S), M]).