diff --git a/src/formatting.rs b/src/formatting.rs index 5292282..b157564 100644 --- a/src/formatting.rs +++ b/src/formatting.rs @@ -19,10 +19,22 @@ pub fn pretty_eval(mut input: String) -> Result { .is_some(); let result = nodes::eval(&input)?; - let significant_digits = get_significant_digits(&result).min(MAX_DIGITS); + let display_digits = + get_significant_digits(&result) + .min(MAX_DIGITS) + .max(if result >= 1000 || result < 1 { + 1 + } else if result >= 100 { + 3 + } else if result >= 10 { + 2 + // if result >= 1 + } else { + 1 + }); Ok(format!( - "{}{}{result:.significant_digits$}{}", + "{}{}{result:.display_digits$}{}", " ".repeat(leading_spaces), if should_add_back_equals && should_add_back_alignment { "& = " @@ -34,7 +46,8 @@ pub fn pretty_eval(mut input: String) -> Result { "" }, if should_add_back_backslash { " \\" } else { "" } - )) + ) + .replace('e', " * 10^")) } #[test] fn test_character_readdition() { @@ -43,9 +56,19 @@ fn test_character_readdition() { assert_eq!(pretty_eval(" & 11".into()).unwrap(), " & 11"); assert_eq!(pretty_eval(" & 11 \\".into()).unwrap(), " & 11 \\"); } +#[test] +fn test_basic_up_to_999() { + assert_eq!(pretty_eval("1".into()).unwrap(), "1"); + assert_eq!(pretty_eval("10".into()).unwrap(), "10"); + assert_eq!(pretty_eval("100".into()).unwrap(), "100"); + assert_eq!(pretty_eval("999".into()).unwrap(), "999"); + assert_eq!(pretty_eval("1000".into()).unwrap(), "1 * 10^3"); + + assert_eq!(pretty_eval("11.111111".into()).unwrap(), "11.111111"); +} pub fn get_significant_digits(n: &Float) -> usize { - let raw_string: String = format!("{n}").chars().filter(|c| *c != '.').collect(); + let raw_string = n.to_string().replace('.', ""); let mut consecutive_zeros = 0; let mut consecutive_nines = 0; diff --git a/src/nodes/mod.rs b/src/nodes/mod.rs index f435db4..da7c34e 100644 --- a/src/nodes/mod.rs +++ b/src/nodes/mod.rs @@ -25,7 +25,7 @@ pub fn eval(s: &str) -> Result { Ok(Nodes::from_str(s)?.evaluate()?) } -pub const PREC: u32 = 512; +pub const PREC: u32 = 2048; #[derive(Debug, Default, Clone, PartialEq)] pub struct Nodes(Vec);