1pub fn format_file_size(size: u64, use_decimal: bool) -> String {
2 if use_decimal {
3 if size < 1000 {
4 format!("{size}B")
5 } else if size < 1000 * 1000 {
6 format!("{:.1}KB", size as f64 / 1000.0)
7 } else {
8 format!("{:.1}MB", size as f64 / (1000.0 * 1000.0))
9 }
10 } else if size < 1024 {
11 format!("{size}B")
12 } else if size < 1024 * 1024 {
13 format!("{:.1}KiB", size as f64 / 1024.0)
14 } else {
15 format!("{:.1}MiB", size as f64 / (1024.0 * 1024.0))
16 }
17}
18
19#[cfg(test)]
20mod tests {
21 use super::*;
22
23 #[test]
24 fn test_format_file_size_decimal() {
25 assert_eq!(format_file_size(0, true), "0B");
26 assert_eq!(format_file_size(999, true), "999B");
27 assert_eq!(format_file_size(1000, true), "1.0KB");
28 assert_eq!(format_file_size(1500, true), "1.5KB");
29 assert_eq!(format_file_size(999999, true), "1000.0KB");
30 assert_eq!(format_file_size(1000000, true), "1.0MB");
31 assert_eq!(format_file_size(1500000, true), "1.5MB");
32 assert_eq!(format_file_size(10000000, true), "10.0MB");
33 }
34
35 #[test]
36 fn test_format_file_size_binary() {
37 assert_eq!(format_file_size(0, false), "0B");
38 assert_eq!(format_file_size(1023, false), "1023B");
39 assert_eq!(format_file_size(1024, false), "1.0KiB");
40 assert_eq!(format_file_size(1536, false), "1.5KiB");
41 assert_eq!(format_file_size(1048575, false), "1024.0KiB");
42 assert_eq!(format_file_size(1048576, false), "1.0MiB");
43 assert_eq!(format_file_size(1572864, false), "1.5MiB");
44 assert_eq!(format_file_size(10485760, false), "10.0MiB");
45 }
46}