Skip to content

Commit

Permalink
bpo-27772: Make preceding width with 0 valid in string format. (GH-11270
Browse files Browse the repository at this point in the history
)

Previously it was an error with confusing error message.
  • Loading branch information
serhiy-storchaka committed Jan 25, 2021
1 parent 8dfe156 commit cf19cc3
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 3 deletions.
8 changes: 6 additions & 2 deletions Doc/library/string.rst
Original file line number Diff line number Diff line change
Expand Up @@ -347,8 +347,8 @@ The meaning of the various alignment options is as follows:
| ``'='`` | Forces the padding to be placed after the sign (if any) |
| | but before the digits. This is used for printing fields |
| | in the form '+000000120'. This alignment option is only |
| | valid for numeric types. It becomes the default when '0'|
| | immediately precedes the field width. |
| | valid for numeric types. It becomes the default for |
| | numbers when '0' immediately precedes the field width. |
+---------+----------------------------------------------------------+
| ``'^'`` | Forces the field to be centered within the available |
| | space. |
Expand Down Expand Up @@ -424,6 +424,10 @@ When no explicit alignment is given, preceding the *width* field by a zero
sign-aware zero-padding for numeric types. This is equivalent to a *fill*
character of ``'0'`` with an *alignment* type of ``'='``.

.. versionchanged:: 3.10
Preceding the *width* field by ``'0'`` no longer affects the default
alignment for strings.

The *precision* is a decimal number indicating how many digits should be
displayed after the decimal point for a floating point value formatted with
``'f'`` and ``'F'``, or before and after the decimal point for a floating point
Expand Down
6 changes: 6 additions & 0 deletions Lib/test/test_unicode.py
Original file line number Diff line number Diff line change
Expand Up @@ -1098,6 +1098,12 @@ def __repr__(self):
self.assertEqual('{0:^8s}'.format('result'), ' result ')
self.assertEqual('{0:^9s}'.format('result'), ' result ')
self.assertEqual('{0:^10s}'.format('result'), ' result ')
self.assertEqual('{0:8s}'.format('result'), 'result ')
self.assertEqual('{0:0s}'.format('result'), 'result')
self.assertEqual('{0:08s}'.format('result'), 'result00')
self.assertEqual('{0:<08s}'.format('result'), 'result00')
self.assertEqual('{0:>08s}'.format('result'), '00result')
self.assertEqual('{0:^08s}'.format('result'), '0result0')
self.assertEqual('{0:10000}'.format('a'), 'a' + ' ' * 9999)
self.assertEqual('{0:10000}'.format(''), ' ' * 10000)
self.assertEqual('{0:10000000}'.format(''), ' ' * 10000000)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
In string formatting, preceding the *width* field by ``'0'`` no longer
affects the default alignment for strings.
2 changes: 1 addition & 1 deletion Python/formatter_unicode.c
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ parse_internal_render_format_spec(PyObject *format_spec,
/* The special case for 0-padding (backwards compat) */
if (!fill_char_specified && end-pos >= 1 && READ_spec(pos) == '0') {
format->fill_char = '0';
if (!align_specified) {
if (!align_specified && default_align == '>') {
format->align = '=';
}
++pos;
Expand Down

0 comments on commit cf19cc3

Please sign in to comment.