From 21d08e53d7e19cf9358e830d185dee8a5ca58640 Mon Sep 17 00:00:00 2001 From: jfh Date: Thu, 7 Oct 2021 19:18:09 +0300 Subject: [PATCH] Fix complex::repr to correctly print floats. --- vm/src/builtins/complex.rs | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/vm/src/builtins/complex.rs b/vm/src/builtins/complex.rs index db5d6b0c3..e8e83f8b6 100644 --- a/vm/src/builtins/complex.rs +++ b/vm/src/builtins/complex.rs @@ -335,14 +335,33 @@ impl PyComplex { #[pymethod(magic)] fn repr(&self) -> String { let Complex64 { re, im } = self.value; - // converting to lowercase to format "NaN" as "nan" - if re == 0.0 { - format!("{}j", im).to_lowercase() - } else if im.is_nan() { - format!("({}+{:+}j)", re, im).to_lowercase() + // integer => drop ., fractional => float_ops + let mut im_part = if im.fract() == 0.0 { + im.to_string() } else { - format!("({}{:+}j)", re, im).to_lowercase() + float_ops::to_string(im) + }; + im_part.push('j'); + + // empty => return im_part, integer => drop ., fractional => float_ops + let re_part = if re == 0.0 { + return im_part; + } else if re.fract() == 0.0 { + re.to_string() + } else { + float_ops::to_string(re) + }; + let mut result = String::with_capacity( + re_part.len() + im_part.len() + 2 + if im.is_sign_positive() { 1 } else { 0 }, + ); + result.push('('); + result.push_str(&re_part); + if im.is_sign_positive() { + result.push('+'); } + result.push_str(&im_part); + result.push(')'); + result } #[pymethod(magic)]