summaryrefslogtreecommitdiffstats
path: root/src/display.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/display.rs')
-rw-r--r--src/display.rs43
1 files changed, 30 insertions, 13 deletions
diff --git a/src/display.rs b/src/display.rs
index 9f96741..de828c6 100644
--- a/src/display.rs
+++ b/src/display.rs
@@ -409,31 +409,48 @@ fn get_pretty_name(
}
}
-pub fn human_readable_number(size: u64, output_str: &str) -> String {
+// If we are working with SI units or not
+pub fn get_type_of_thousand(output_str: &str) -> u64 {
let is_si = output_str.contains('i'); // si, KiB, MiB, etc
- let num: u64 = if is_si { 1000 } else { 1024 };
+ if is_si {
+ 1000
+ } else {
+ 1024
+ }
+}
+pub fn get_number_format(output_str: &str) -> Option<(u64, char)> {
if output_str.starts_with('b') {
- return format!("{}B", size);
+ return Some((1, 'B'));
}
for (i, u) in UNITS.iter().enumerate() {
if output_str.starts_with((*u).to_ascii_lowercase()) {
- let marker = num.pow((UNITS.len() - i) as u32);
- return format!("{}{}", (size / marker), u);
+ let marker = get_type_of_thousand(output_str).pow((UNITS.len() - i) as u32);
+ return Some((marker, *u));
}
}
+ None
+}
- for (i, u) in UNITS.iter().enumerate() {
- let marker = num.pow((UNITS.len() - i) as u32);
- if size >= marker {
- if size / marker < 10 {
- return format!("{:.1}{}", (size as f32 / marker as f32), u);
- } else {
- return format!("{}{}", (size / marker), u);
+pub fn human_readable_number(size: u64, output_str: &str) -> String {
+ match get_number_format(output_str) {
+ Some((x, u)) => {
+ format!("{}{}", (size / x), u)
+ }
+ None => {
+ for (i, u) in UNITS.iter().enumerate() {
+ let marker = get_type_of_thousand(output_str).pow((UNITS.len() - i) as u32);
+ if size >= marker {
+ if size / marker < 10 {
+ return format!("{:.1}{}", (size as f32 / marker as f32), u);
+ } else {
+ return format!("{}{}", (size / marker), u);
+ }
+ }
}
+ format!("{size}B")
}
}
- format!("{size}B")
}
mod tests {