Я написал программу для преобразования размера файла из байтов в читаемом формате в 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
Run например:
> humanReadable 33;;
33.0 B
val it : unit =()
> humanReadable 323379443;;
308.4 MiB
val it : unit =()
>
Вопрос:
Это было быть хорошим, если я могу установить
i=0
в качестве значения по умолчанию вsizeFmt
funciton. Я проверил документацию F #, нашел только, что нет параметра по умолчанию. Поэтому я должен написать функцию оберткиhumanReadable
. Есть ли способ лучше?Для обработки как ввода типа int, так и типа float, как
humanReadable 123;;
иhumanReadable 123433.33;;
, я должен добавитьfloat n
в функцию обертки. Очевидная проблема: очень легко превысить максимальный размерint
, который составляет 2,147,483,647. Думаю, что может быть лучший способ, не так ли?
Вам нужно, в какой-то момент, * форсированную глубину? Например, '42,000,000' ->' "41,025.625 KiB" '? Или это всегда должно быть «40.0543 MiB»? – bytebuster
Рамки сообщают размеры файлов как int64; это один «лучший способ». – phoog
@bytebuster Он должен быть: не более трех цифр до десятичной точки + самой большой соответствующей единицы. Например: '40.1 MiB',' 438.0 KiB', '249.8 GiB'. (Я использовал '% 3.1f' для его форматирования.) – Nick