size.rs

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