pub fn format_bytes(bytes: u64) -> String {
const UNITS: [&str; 5] = ["B", "KB", "MB", "GB", "TB"];
let mut value = bytes as f64;
let mut unit = 0;
while value >= 1000.0 && unit < UNITS.len() - 1 {
value /= 1000.0;
unit += 1;
}
if unit == 0 {
format!("{bytes} B")
} else if value >= 100.0 {
format!("{value:.0} {}", UNITS[unit])
} else if value >= 10.0 {
format!("{value:.1} {}", UNITS[unit])
} else {
format!("{value:.2} {}", UNITS[unit])
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn formats_known_sizes() {
assert_eq!(format_bytes(0), "0 B");
assert_eq!(format_bytes(512), "512 B");
assert_eq!(format_bytes(14_000_000_000), "14.0 GB");
}
}