]> granicus.if.org Git - python/commitdiff
Issue #9416: Fix some issues with complex formatting where the
authorMark Dickinson <dickinsm@gmail.com>
Sun, 1 Aug 2010 10:41:49 +0000 (10:41 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Sun, 1 Aug 2010 10:41:49 +0000 (10:41 +0000)
output with no type specifier failed to match the str output:

  - format(complex(-0.0, 2.0), '-') omitted the real part from the output,
  - format(complex(0.0, 2.0), '-') included a sign and parentheses.

Lib/test/test_complex.py
Misc/NEWS
Objects/stringlib/formatter.h

index cecf38f7d57cfd73bd4938ec3b52022f29a31a75..1564e89aa6b3d5a863c8a8b23428579c70235fd2 100644 (file)
@@ -506,6 +506,16 @@ class ComplexTest(unittest.TestCase):
         self.assertEqual(format(z, '-'), str(z))
         self.assertEqual(format(z, '<'), str(z))
         self.assertEqual(format(z, '10'), str(z))
+        z = complex(0.0, 3.0)
+        self.assertEqual(format(z, ''), str(z))
+        self.assertEqual(format(z, '-'), str(z))
+        self.assertEqual(format(z, '<'), str(z))
+        self.assertEqual(format(z, '2'), str(z))
+        z = complex(-0.0, 2.0)
+        self.assertEqual(format(z, ''), str(z))
+        self.assertEqual(format(z, '-'), str(z))
+        self.assertEqual(format(z, '<'), str(z))
+        self.assertEqual(format(z, '3'), str(z))
 
         self.assertEqual(format(1+3j, 'g'), '1+3j')
         self.assertEqual(format(3j, 'g'), '0+3j')
index 96ff051ababcf3a007f57405dd7379f44a235088..eb4fdca1ab3d487285906e8b0a885dbb9e6dd9bb 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,12 @@ What's New in Python 3.2 Alpha 2?
 Core and Builtins
 -----------------
 
+- Issue #9416: Fix some issues with complex formatting where the
+  output with no type specifier failed to match the str output:
+
+    - format(complex(-0.0, 2.0), '-') omitted the real part from the output,
+    - format(complex(0.0, 2.0), '-') included a sign and parentheses.
+
 Library
 -------
 
index ba2a251c2f154dffc3f5c7512c03172cd63cf998..ab57a82288cd52712459ad06ce60ce3943aa819e 100644 (file)
@@ -1136,9 +1136,10 @@ format_complex_internal(PyObject *value,
         /* Omitted type specifier. Should be like str(self). */
         type = 'g';
         default_precision = PyFloat_STR_PRECISION;
-        add_parens = 1;
-        if (re == 0.0)
+        if (re == 0.0 && copysign(1.0, re) == 1.0)
             skip_re = 1;
+        else
+            add_parens = 1;
     }
 
     if (type == 'n')
@@ -1223,8 +1224,11 @@ format_complex_internal(PyObject *value,
                                     n_re_digits, n_re_remainder,
                                     re_has_decimal, &locale, &tmp_format);
 
-    /* Same formatting, but always include a sign. */
-    tmp_format.sign = '+';
+    /* Same formatting, but always include a sign, unless the real part is
+     * going to be omitted, in which case we use whatever sign convention was
+     * requested by the original format. */
+    if (!skip_re)
+        tmp_format.sign = '+';
     n_im_total = calc_number_widths(&im_spec, 0, im_sign_char, p_im,
                                     n_im_digits, n_im_remainder,
                                     im_has_decimal, &locale, &tmp_format);