我写了一个程序用于将文件大小从字节转换为易读格式的F#代码:
let rec sizeFmt num i =
let suffix="B"
let unit = ["";"Ki";"Mi";"Gi";"Ti";"Pi";"Ei";"Zi"]
match abs num with
| x when x < 1024.0 -> printfn "%3.1f %s%s" num unit.[i] suffix
| _ -> sizeFmt (num / 1024.0) (i+1)
let humanReadable n =
sizeFmt (float n) 0
运行示例:
> humanReadable 33;;
33.0 B
val it : unit = ()
> humanReadable 323379443;;
308.4 MiB
val it : unit = ()
>
问题:
如果我想把
i=0
设置为sizeFmt
函数的默认值,该怎么办?我查了 F# 文档,发现没有默认参数。所以我得写一个包装函数humanReadable
。有没有更好的方法?为了处理像
humanReadable 123;;
和humanReadable 123433.33;;
这样的 int 和 float 类型输入,我不得不在包装函数中添加一个float n
。显然问题是:很容易超过最大的int
大小,即 2,147,483,647。我猜应该有更好的方法,对吗?
42,000,000
->"41,025.625 KiB"
?还是它总是应该是"40.0543 MiB"
? - Be Brave Be Like Ukraine40.1 MiB
,438.0 KiB
,249.8 GiB
。(我使用了%3.1f
进行格式化。) - Nick