Tôi đã viết một chương trình để chuyển đổi kích thước tập tin từ byte sang một định dạng có thể đọc được của con người trong F #:Có tham số mặc định trong F # không?
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 dụ:
> humanReadable 33;;
33.0 B
val it : unit =()
> humanReadable 323379443;;
308.4 MiB
val it : unit =()
>
Câu hỏi:
Nó sẽ thật tuyệt nếu tôi có thể đặt
i=0
làm giá trị mặc định trongsizeFmt
funciton. Tôi đã kiểm tra tài liệu F #, chỉ thấy rằng không có tham số mặc định. Vì vậy, tôi phải viết một hàm wrapperhumanReadable
. Có cách nào tốt hơn?Để xử lý cả kiểu nhập int và kiểu float như
humanReadable 123;;
vàhumanReadable 123433.33;;
, tôi phải thêmfloat n
vào chức năng trình bao bọc. Vấn đề rõ ràng là: nó rất dễ dàng để vượt quá kích thước tối đaint
là 2.147.483.647. Tôi đoán có thể có một cách tốt hơn, phải không?
Bạn có cần, tại một số thời điểm, độ sâu * ép * không? Ví dụ: '42.000.000' -> '" 41,025,625 KiB "'? Hay nó luôn được coi là "40.0543 MiB"? – bytebuster
Khuôn khổ báo cáo kích thước tệp dưới dạng int64; đó là một "cách tốt hơn". – phoog
@bytebuster Nó được cho là: không quá ba chữ số trước dấu thập phân + đơn vị thích hợp lớn nhất. Ví dụ: '40.1 MiB',' 438.0 KiB', '249.8 GiB'. (Tôi đã sử dụng '% 3.1f' để định dạng nó.) – Nick