mirror of
https://github.com/python/cpython.git
synced 2025-09-06 17:02:26 +00:00
Merged revisions 78349 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r78349 | eric.smith | 2010-02-22 19:11:16 -0500 (Mon, 22 Feb 2010) | 1 line Issue #6902: Fix problem with built-in types format incorrectly with 0 padding. ........
This commit is contained in:
parent
b2ceb3ad9e
commit
abb28c62de
3 changed files with 33 additions and 4 deletions
|
@ -357,6 +357,17 @@ class TypesTests(unittest.TestCase):
|
||||||
self.assertEqual(value.__format__(format_spec),
|
self.assertEqual(value.__format__(format_spec),
|
||||||
float(value).__format__(format_spec))
|
float(value).__format__(format_spec))
|
||||||
|
|
||||||
|
# Issue 6902
|
||||||
|
test(123456, "0<20", '12345600000000000000')
|
||||||
|
test(123456, "1<20", '12345611111111111111')
|
||||||
|
test(123456, "*<20", '123456**************')
|
||||||
|
test(123456, "0>20", '00000000000000123456')
|
||||||
|
test(123456, "1>20", '11111111111111123456')
|
||||||
|
test(123456, "*>20", '**************123456')
|
||||||
|
test(123456, "0=20", '00000000000000123456')
|
||||||
|
test(123456, "1=20", '11111111111111123456')
|
||||||
|
test(123456, "*=20", '**************123456')
|
||||||
|
|
||||||
@run_with_locale('LC_NUMERIC', 'en_US.UTF8')
|
@run_with_locale('LC_NUMERIC', 'en_US.UTF8')
|
||||||
def test_float__format__locale(self):
|
def test_float__format__locale(self):
|
||||||
# test locale support for __format__ code 'n'
|
# test locale support for __format__ code 'n'
|
||||||
|
@ -510,6 +521,17 @@ class TypesTests(unittest.TestCase):
|
||||||
self.assertRaises(ValueError, format, 0.0, '#')
|
self.assertRaises(ValueError, format, 0.0, '#')
|
||||||
self.assertRaises(ValueError, format, 0.0, '#20f')
|
self.assertRaises(ValueError, format, 0.0, '#20f')
|
||||||
|
|
||||||
|
# Issue 6902
|
||||||
|
test(12345.6, "0<20", '12345.60000000000000')
|
||||||
|
test(12345.6, "1<20", '12345.61111111111111')
|
||||||
|
test(12345.6, "*<20", '12345.6*************')
|
||||||
|
test(12345.6, "0>20", '000000000000012345.6')
|
||||||
|
test(12345.6, "1>20", '111111111111112345.6')
|
||||||
|
test(12345.6, "*>20", '*************12345.6')
|
||||||
|
test(12345.6, "0=20", '000000000000012345.6')
|
||||||
|
test(12345.6, "1=20", '111111111111112345.6')
|
||||||
|
test(12345.6, "*=20", '*************12345.6')
|
||||||
|
|
||||||
def test_format_spec_errors(self):
|
def test_format_spec_errors(self):
|
||||||
# int, float, and string all share the same format spec
|
# int, float, and string all share the same format spec
|
||||||
# mini-language parser.
|
# mini-language parser.
|
||||||
|
|
|
@ -12,6 +12,10 @@ What's New in Python 3.2 Alpha 1?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
=======
|
||||||
|
- Issue #6902: Fix problem with built-in types format incorrectly with
|
||||||
|
0 padding.
|
||||||
|
|
||||||
- Issue #7988: Fix default alignment to be right aligned for
|
- Issue #7988: Fix default alignment to be right aligned for
|
||||||
complex.__format__. Now it matches other numeric types.
|
complex.__format__. Now it matches other numeric types.
|
||||||
|
|
||||||
|
|
|
@ -151,10 +151,10 @@ DEBUG_PRINT_FORMAT_SPEC(InternalFormatSpec *format)
|
||||||
printf("internal format spec: align %d\n", format->align);
|
printf("internal format spec: align %d\n", format->align);
|
||||||
printf("internal format spec: alternate %d\n", format->alternate);
|
printf("internal format spec: alternate %d\n", format->alternate);
|
||||||
printf("internal format spec: sign %d\n", format->sign);
|
printf("internal format spec: sign %d\n", format->sign);
|
||||||
printf("internal format spec: width %d\n", format->width);
|
printf("internal format spec: width %zd\n", format->width);
|
||||||
printf("internal format spec: thousands_separators %d\n",
|
printf("internal format spec: thousands_separators %d\n",
|
||||||
format->thousands_separators);
|
format->thousands_separators);
|
||||||
printf("internal format spec: precision %d\n", format->precision);
|
printf("internal format spec: precision %zd\n", format->precision);
|
||||||
printf("internal format spec: type %c\n", format->type);
|
printf("internal format spec: type %c\n", format->type);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
@ -181,6 +181,7 @@ parse_internal_render_format_spec(STRINGLIB_CHAR *format_spec,
|
||||||
the input string */
|
the input string */
|
||||||
|
|
||||||
Py_ssize_t consumed;
|
Py_ssize_t consumed;
|
||||||
|
int align_specified = 0;
|
||||||
|
|
||||||
format->fill_char = '\0';
|
format->fill_char = '\0';
|
||||||
format->align = default_align;
|
format->align = default_align;
|
||||||
|
@ -196,10 +197,12 @@ parse_internal_render_format_spec(STRINGLIB_CHAR *format_spec,
|
||||||
if (end-ptr >= 2 && is_alignment_token(ptr[1])) {
|
if (end-ptr >= 2 && is_alignment_token(ptr[1])) {
|
||||||
format->align = ptr[1];
|
format->align = ptr[1];
|
||||||
format->fill_char = ptr[0];
|
format->fill_char = ptr[0];
|
||||||
|
align_specified = 1;
|
||||||
ptr += 2;
|
ptr += 2;
|
||||||
}
|
}
|
||||||
else if (end-ptr >= 1 && is_alignment_token(ptr[0])) {
|
else if (end-ptr >= 1 && is_alignment_token(ptr[0])) {
|
||||||
format->align = ptr[0];
|
format->align = ptr[0];
|
||||||
|
align_specified = 1;
|
||||||
++ptr;
|
++ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,7 +222,7 @@ parse_internal_render_format_spec(STRINGLIB_CHAR *format_spec,
|
||||||
/* The special case for 0-padding (backwards compat) */
|
/* The special case for 0-padding (backwards compat) */
|
||||||
if (format->fill_char == '\0' && end-ptr >= 1 && ptr[0] == '0') {
|
if (format->fill_char == '\0' && end-ptr >= 1 && ptr[0] == '0') {
|
||||||
format->fill_char = '0';
|
format->fill_char = '0';
|
||||||
if (format->align == '\0') {
|
if (!align_specified) {
|
||||||
format->align = '=';
|
format->align = '=';
|
||||||
}
|
}
|
||||||
++ptr;
|
++ptr;
|
||||||
|
@ -495,7 +498,7 @@ calc_number_widths(NumberFieldWidths *spec, Py_ssize_t n_prefix,
|
||||||
|
|
||||||
/* min_width can go negative, that's okay. format->width == -1 means
|
/* min_width can go negative, that's okay. format->width == -1 means
|
||||||
we don't care. */
|
we don't care. */
|
||||||
if (format->fill_char == '0')
|
if (format->fill_char == '0' && format->align == '=')
|
||||||
spec->n_min_width = format->width - n_non_digit_non_padding;
|
spec->n_min_width = format->width - n_non_digit_non_padding;
|
||||||
else
|
else
|
||||||
spec->n_min_width = 0;
|
spec->n_min_width = 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue