lockbook_shared/
usage.rs

1const BYTE: u64 = 1;
2const KILOBYTE: u64 = BYTE * 1000;
3const MEGABYTE: u64 = KILOBYTE * 1000;
4const GIGABYTE: u64 = MEGABYTE * 1000;
5const TERABYTE: u64 = GIGABYTE * 1000;
6
7const KILOBYTE_MINUS_ONE: u64 = KILOBYTE - 1;
8const MEGABYTE_MINUS_ONE: u64 = MEGABYTE - 1;
9const GIGABYTE_MINUS_ONE: u64 = GIGABYTE - 1;
10const TERABYTE_MINUS_ONE: u64 = TERABYTE - 1;
11
12pub fn bytes_to_human(size: u64) -> String {
13    let (unit, abbr) = match size {
14        0..=KILOBYTE_MINUS_ONE => (BYTE, "B"),
15        KILOBYTE..=MEGABYTE_MINUS_ONE => (KILOBYTE, "KB"),
16        MEGABYTE..=GIGABYTE_MINUS_ONE => (MEGABYTE, "MB"),
17        GIGABYTE..=TERABYTE_MINUS_ONE => (GIGABYTE, "GB"),
18        TERABYTE..=u64::MAX => (TERABYTE, "TB"),
19    };
20
21    let size_in_unit = size as f64 / unit as f64;
22    let dec = f64::trunc(size_in_unit.fract() * 100.0) / 100.0;
23
24    let num = format!("{:.2}", size_in_unit.trunc() + dec)
25        .trim_end_matches(['0'])
26        .trim_end_matches(['.'])
27        .to_owned();
28
29    format!("{} {}", num, abbr)
30}