From aad57bd1bbaea92a5619a8d79d3d2ed90d32a35f Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Sun, 1 Aug 2010 10:45:15 +0000 Subject: [PATCH] Merged revisions 83400 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r83400 | mark.dickinson | 2010-08-01 11:41:49 +0100 (Sun, 01 Aug 2010) | 7 lines 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. ........ --- Lib/test/test_complex.py | 10 ++++++++++ Misc/NEWS | 6 ++++++ Objects/stringlib/formatter.h | 12 ++++++++---- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_complex.py b/Lib/test/test_complex.py index 69e27151304..a459f844808 100644 --- a/Lib/test/test_complex.py +++ b/Lib/test/test_complex.py @@ -558,6 +558,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') diff --git a/Misc/NEWS b/Misc/NEWS index 14f3fb042d5..2c3e7293a13 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,12 @@ What's New in Python 2.7.1? 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. + - Issue #7616: Fix copying of overlapping memoryview slices with the Intel compiler. diff --git a/Objects/stringlib/formatter.h b/Objects/stringlib/formatter.h index 7b29a9de3a9..c49a1042ff6 100644 --- a/Objects/stringlib/formatter.h +++ b/Objects/stringlib/formatter.h @@ -1144,9 +1144,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') @@ -1231,8 +1232,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);