1use std::fmt;
2
3#[derive(Clone, Copy, Debug)]
5pub enum Units {
6 B = 1,
7 KB = 1_000,
8 MB = 1_000_000,
9 GB = 1_000_000_000,
10 TB = 1_000_000_000_000,
11 PB = 1_000_000_000_000_000,
12}
13
14impl fmt::Display for Units {
15 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
16 write!(f, "{:?}", self)
17 }
18}
19
20pub fn human_readable(num: u64, as_float: bool) -> String {
33 let result = String::from("");
34 match num {
35 ..=1_000 => result + &num.to_string() + "B",
36 1_001..=1_000_000 => construct_hr_output(&num, as_float, Units::KB),
37 1_000_001..=1_000_000_000 => construct_hr_output(&num, as_float, Units::MB),
38 1_000_000_001..=1_000_000_000_000 => construct_hr_output(&num, as_float, Units::GB),
39 1_000_000_000_001..=1_000_000_000_000_000 => construct_hr_output(&num, as_float, Units::TB),
40 1_000_000_000_000_001.. => construct_hr_output(&num, as_float, Units::PB),
41 }
42}
43
44fn construct_hr_output(num: &u64, as_float: bool, unit: Units) -> String {
45 if as_float {
46 format!("{:.2}{}", *num as f64 / (unit as u64) as f64, unit)
47 } else {
48 format!("{:.2}{}", num / unit as u64, unit)
49 }
50}