我写了一个程序,文件大小从字节转换为F#人类可读的格式: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
。显而易见的问题是:超过最大尺寸2,147,483,647是非常容易的。我想可能有更好的方法,在那里?
你需要在某个时候*强制*深度吗?例如,'42,000,000' - >'“41,025.625 KiB”'?或者它总是被认为是“40.0543 MiB”? – bytebuster
该框架报告文件大小为int64s;这是一种“更好的方式”。 – phoog
@bytebuster它应该是:小数点前不超过三位+最大的适当单位。例如:'40.1 MiB','438.0 KiB','249.8 GiB'。 (我用'%3.1f'格式化它。) – Nick