首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以人类可读的方式格式化bytesize的更简单的方法?

以人类可读的方式格式化bytesize的更简单的方法?
EN

Stack Overflow用户
提问于 2010-01-30 01:17:05
回答 1查看 619关注 0票数 2

我想出了以下解决方案来格式化一个整数(文件的字节大小)。有没有更好/更短的解决方案?我真的不喜欢float_as_string()的部分。

代码语言:javascript
复制
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).

编辑:修复了bug round() -> trunc()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-01-31 01:45:07

代码语言:javascript
复制
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]).

请注意,这将返回一个iolist。如果你需要一个字符串,你可以把它转换成二进制,再转换成字符串。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2163691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档