From c745d6b5d2e9960c44be9542ac5d6a674f60ed06 Mon Sep 17 00:00:00 2001 From: electria Date: Fri, 2 Oct 2026 13:22:49 -0700 Subject: [PATCH] feat: don't print scientific notation for n < 1000 unfortunately it isn't this easy for n > 0.001, a similar strategy seems to prefer printing eg 1.0 * 10^-1 --- src/formatting.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/formatting.rs b/src/formatting.rs index e893d9b..cf3f6e5 100644 --- a/src/formatting.rs +++ b/src/formatting.rs @@ -19,10 +19,19 @@ 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 = if result >= 1000 || result < 1 { + get_significant_digits(&result).min(MAX_DIGITS) + } 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 { "& = " @@ -44,6 +53,14 @@ 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"); +} pub fn get_significant_digits(n: &Float) -> usize { let raw_string = n.to_string().replace('.', "");