我想出了以下解决方案来格式化整数(文件的字节大小)。有更好/更短的解决方案吗?我非常不喜欢 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).
编辑:修复了错误 round() -> trunc()
最佳答案
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。如果您需要字符串,可以将其转换为二进制,然后再将其转换为字符串。
关于formatting - 以人类可读的方式格式化字节大小的更简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2163691/