zed_util/
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 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}