From d5ad5b4346ed7a9b12aa1a854e3245f0ceaa93b4 Mon Sep 17 00:00:00 2001 From: NerdyPepper Date: Sat, 27 Apr 2019 22:22:29 +0530 Subject: move formatting functions to new module --- src/format/mod.rs | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 src/format/mod.rs diff --git a/src/format/mod.rs b/src/format/mod.rs new file mode 100644 index 0000000..4ac5612 --- /dev/null +++ b/src/format/mod.rs @@ -0,0 +1,86 @@ +use crate::CONFIGURATION; +use crate::error::{ + CalcError, + Math +}; + +pub fn autobalance_parens(input: &str) -> Result { + let mut balanced = String::from(input); + let mut left_parens = 0; + let mut right_parens = 0; + for letter in input.chars() { + if letter == '(' { + left_parens += 1; + } else if letter == ')' { + right_parens += 1; + } + } + + if left_parens > right_parens { + let extras = ")".repeat(left_parens - right_parens); + balanced.push_str(&extras[..]); + Ok(balanced) + } else if left_parens < right_parens { + return Err(CalcError::Syntax("Mismatched parentheses!".into())) + } else { + Ok(balanced) + } +} + +fn radix_fmt(number: f64, obase: usize) -> Result { + if obase > 36 { + return Err(CalcError::Math(Math::UnknownBase)); + } + + let table: Vec = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".chars().collect(); + + // format integral part of float + let mut integral = number.trunc() as i64; + let mut obase_int = String::new(); + while integral >= obase as i64 { + obase_int.push(table[(integral % obase as i64) as usize]); + integral /= obase as i64; + } + obase_int.push(table[integral as usize]); + if number.is_sign_negative() { + obase_int.push('-'); + } + let obase_int = obase_int.chars().rev().collect::(); + + // format fractional part of float + let mut fract = number.abs().fract(); + let mut obase_fract = String::new(); + let mut i = 0; + loop { + fract *= obase as f64; + obase_fract.push(table[fract.trunc() as usize]); + i += 1; + if fract.fract() == 0. || i > 10 { + break; + } + fract = fract.fract(); + } + Ok(format!("{}.{}", obase_int, obase_fract)) +} + +fn thousand_sep(inp: &str) -> String { + let mut result_string = String::new(); + for (i,c) in inp.to_string().chars().rev().enumerate() { + if i % 3 == 0 && i != 0 && c.to_string() != "-" { + result_string.push(','); + } + result_string.push(c) + } + result_string.chars().rev().collect::() +} + +pub fn pprint(ans: f64) { + let ans_string = radix_fmt(ans, CONFIGURATION.base).unwrap(); + let ans_vector: Vec<&str> = ans_string.split(".").collect(); + match ans_vector.len() { + 1 => println!("{:>10}", thousand_sep(ans_vector[0])), + 2 => println!("{:>10}.{}", thousand_sep(ans_vector[0]),ans_vector[1]), + _ => unreachable!("N-nani?!") + } +} + -- cgit v1.2.3