diff --git a/src/hru.rs b/src/hru.rs index e907fa7..f27d4ab 100644 --- a/src/hru.rs +++ b/src/hru.rs @@ -20,64 +20,36 @@ use std::{ cmp::Ordering, env::args, io::stdin, - process::exit, + process::ExitCode, }; extern crate sysexits; -use sysexits::EX_SOFTWARE; - -fn auto_c(input: u64) -> (u64, u32) { - let mut number = input; - let mut remainder = 0; - let mut exp: u32 = 0; - - if number % 10 > 0 { } - else { - while remainder == 0 { - number /= 10; - remainder = number % 10; - exp += 1; - } - } +use sysexits::EX_DATAERR; +fn convert(input: u64) -> (f64, u32) { let list: Vec = vec![3, 6, 9, 12, 15, 18, 21, 24, 27, 30]; - let mut exps = list.iter().peekable(); + let mut out = (0.0, 0_u32); - while let Some(i) = exps.next() { - match exp.cmp(i) { + if input < 1000 { return (input as f64, 0); } + + for n in list { + let c = 10_u64.pow(n); + match c.cmp(&input) { Ordering::Less => { - number = input; - break; + out = (input as f64 / c as f64, n); }, - Ordering::Equal => break, - Ordering::Greater => { - if let Some(p) = exps.peek() { - match exp.cmp(p) { - Ordering::Less => { - let exp_e = 10_u64.checked_pow(exp) - .unwrap_or_else(|| { exit(EX_SOFTWARE); }); - - let index_e = 10_u64.checked_pow(i.to_owned()) - .unwrap_or_else(|| { exit(EX_SOFTWARE); }); - - number *= exp_e / index_e; - exp = *i; - break; - }, - Ordering::Greater => continue, - _ => break, - }; - } + Ordering::Equal => { + return (input as f64 / c as f64, n); }, + Ordering::Greater => {}, }; } - (number, exp) + out } - -fn main() { +fn main() -> ExitCode { let argv = args().collect::>(); let mut buf = String::new(); let _ = stdin().read_line(&mut buf); @@ -86,11 +58,11 @@ fn main() { Ok(f) => f, Err(err) => { eprintln!("{}: {}", argv[0], err); - exit(1); + return ExitCode::from(EX_DATAERR as u8); }, }; - let (number, prefix) = auto_c(n); + let (number, prefix) = convert(n); let si_prefix = format!("{}B", match prefix { 3 => "K", @@ -106,5 +78,9 @@ fn main() { _ => "", }); - println!("{} {}", number.to_string(), si_prefix); + let out = ((number * 10.0).round() / 10.0).to_string(); + + println!("{} {}", out, si_prefix); + + ExitCode::SUCCESS }