mirror of https://github.com/python/cpython
Merged revisions 78329 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r78329 | eric.smith | 2010-02-22 13:33:47 -0500 (Mon, 22 Feb 2010) | 1 line Issue #7988: Fix default alignment to be right aligned for complex.__format__. Now it matches other numeric types. ........
This commit is contained in:
parent
ac0b889e82
commit
4e260c5636
|
@ -490,6 +490,8 @@ class ComplexTest(unittest.TestCase):
|
||||||
self.assertEqual(format(1.5+3j, '^20'), ' (1.5+3j) ')
|
self.assertEqual(format(1.5+3j, '^20'), ' (1.5+3j) ')
|
||||||
self.assertEqual(format(1.123-3.123j, '^20.2'), ' (1.1-3.1j) ')
|
self.assertEqual(format(1.123-3.123j, '^20.2'), ' (1.1-3.1j) ')
|
||||||
|
|
||||||
|
self.assertEqual(format(1.5+3j, '20.2f'), ' 1.50+3.00j')
|
||||||
|
self.assertEqual(format(1.5+3j, '>20.2f'), ' 1.50+3.00j')
|
||||||
self.assertEqual(format(1.5+3j, '<20.2f'), '1.50+3.00j ')
|
self.assertEqual(format(1.5+3j, '<20.2f'), '1.50+3.00j ')
|
||||||
self.assertEqual(format(1.5e20+3j, '<20.2f'), '150000000000000000000.00+3.00j')
|
self.assertEqual(format(1.5e20+3j, '<20.2f'), '150000000000000000000.00+3.00j')
|
||||||
self.assertEqual(format(1.5e20+3j, '>40.2f'), ' 150000000000000000000.00+3.00j')
|
self.assertEqual(format(1.5e20+3j, '>40.2f'), ' 150000000000000000000.00+3.00j')
|
||||||
|
|
|
@ -12,6 +12,9 @@ What's New in Python 3.2 Alpha 1?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #7988: Fix default alignment to be right aligned for
|
||||||
|
complex.__format__. Now it matches other numeric types.
|
||||||
|
|
||||||
- Issue #5988: Remove deprecated functions PyOS_ascii_formatd,
|
- Issue #5988: Remove deprecated functions PyOS_ascii_formatd,
|
||||||
PyOS_ascii_strtod, and PyOS_ascii_atof. Use PyOS_double_to_string
|
PyOS_ascii_strtod, and PyOS_ascii_atof. Use PyOS_double_to_string
|
||||||
and PyOS_string_to_double instead. See issue #5835 for the original
|
and PyOS_string_to_double instead. See issue #5835 for the original
|
||||||
|
|
|
@ -141,6 +141,26 @@ typedef struct {
|
||||||
STRINGLIB_CHAR type;
|
STRINGLIB_CHAR type;
|
||||||
} InternalFormatSpec;
|
} InternalFormatSpec;
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* Occassionally useful for debugging. Should normally be commented out. */
|
||||||
|
static void
|
||||||
|
DEBUG_PRINT_FORMAT_SPEC(InternalFormatSpec *format)
|
||||||
|
{
|
||||||
|
printf("internal format spec: fill_char %d\n", format->fill_char);
|
||||||
|
printf("internal format spec: align %d\n", format->align);
|
||||||
|
printf("internal format spec: alternate %d\n", format->alternate);
|
||||||
|
printf("internal format spec: sign %d\n", format->sign);
|
||||||
|
printf("internal format spec: width %d\n", format->width);
|
||||||
|
printf("internal format spec: thousands_separators %d\n",
|
||||||
|
format->thousands_separators);
|
||||||
|
printf("internal format spec: precision %d\n", format->precision);
|
||||||
|
printf("internal format spec: type %c\n", format->type);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ptr points to the start of the format_spec, end points just past its end.
|
ptr points to the start of the format_spec, end points just past its end.
|
||||||
fills in format with the parsed information.
|
fills in format with the parsed information.
|
||||||
|
@ -151,7 +171,8 @@ static int
|
||||||
parse_internal_render_format_spec(STRINGLIB_CHAR *format_spec,
|
parse_internal_render_format_spec(STRINGLIB_CHAR *format_spec,
|
||||||
Py_ssize_t format_spec_len,
|
Py_ssize_t format_spec_len,
|
||||||
InternalFormatSpec *format,
|
InternalFormatSpec *format,
|
||||||
char default_type)
|
char default_type,
|
||||||
|
char default_align)
|
||||||
{
|
{
|
||||||
STRINGLIB_CHAR *ptr = format_spec;
|
STRINGLIB_CHAR *ptr = format_spec;
|
||||||
STRINGLIB_CHAR *end = format_spec + format_spec_len;
|
STRINGLIB_CHAR *end = format_spec + format_spec_len;
|
||||||
|
@ -162,7 +183,7 @@ parse_internal_render_format_spec(STRINGLIB_CHAR *format_spec,
|
||||||
Py_ssize_t consumed;
|
Py_ssize_t consumed;
|
||||||
|
|
||||||
format->fill_char = '\0';
|
format->fill_char = '\0';
|
||||||
format->align = '\0';
|
format->align = default_align;
|
||||||
format->alternate = 0;
|
format->alternate = 0;
|
||||||
format->sign = '\0';
|
format->sign = '\0';
|
||||||
format->width = -1;
|
format->width = -1;
|
||||||
|
@ -296,14 +317,19 @@ calc_padding(Py_ssize_t nchars, Py_ssize_t width, STRINGLIB_CHAR align,
|
||||||
*n_total = nchars;
|
*n_total = nchars;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* figure out how much leading space we need, based on the
|
/* Figure out how much leading space we need, based on the
|
||||||
aligning */
|
aligning */
|
||||||
if (align == '>')
|
if (align == '>')
|
||||||
*n_lpadding = *n_total - nchars;
|
*n_lpadding = *n_total - nchars;
|
||||||
else if (align == '^')
|
else if (align == '^')
|
||||||
*n_lpadding = (*n_total - nchars) / 2;
|
*n_lpadding = (*n_total - nchars) / 2;
|
||||||
else
|
else if (align == '<' || align == '=')
|
||||||
*n_lpadding = 0;
|
*n_lpadding = 0;
|
||||||
|
else {
|
||||||
|
/* We should never have an unspecified alignment. */
|
||||||
|
*n_lpadding = 0;
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
*n_rpadding = *n_total - nchars - *n_lpadding;
|
*n_rpadding = *n_total - nchars - *n_lpadding;
|
||||||
}
|
}
|
||||||
|
@ -505,10 +531,14 @@ calc_number_widths(NumberFieldWidths *spec, Py_ssize_t n_prefix,
|
||||||
case '=':
|
case '=':
|
||||||
spec->n_spadding = n_padding;
|
spec->n_spadding = n_padding;
|
||||||
break;
|
break;
|
||||||
default:
|
case '>':
|
||||||
/* Handles '>', plus catch-all just in case. */
|
|
||||||
spec->n_lpadding = n_padding;
|
spec->n_lpadding = n_padding;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
/* Shouldn't get here, but treat it as '>' */
|
||||||
|
spec->n_lpadding = n_padding;
|
||||||
|
assert(0);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return spec->n_lpadding + spec->n_sign + spec->n_prefix +
|
return spec->n_lpadding + spec->n_sign + spec->n_prefix +
|
||||||
|
@ -1190,7 +1220,7 @@ format_complex_internal(PyObject *value,
|
||||||
/* Turn off any padding. We'll do it later after we've composed
|
/* Turn off any padding. We'll do it later after we've composed
|
||||||
the numbers without padding. */
|
the numbers without padding. */
|
||||||
tmp_format.fill_char = '\0';
|
tmp_format.fill_char = '\0';
|
||||||
tmp_format.align = '\0';
|
tmp_format.align = '<';
|
||||||
tmp_format.width = -1;
|
tmp_format.width = -1;
|
||||||
|
|
||||||
/* Calculate how much memory we'll need. */
|
/* Calculate how much memory we'll need. */
|
||||||
|
@ -1266,7 +1296,7 @@ FORMAT_STRING(PyObject *obj,
|
||||||
|
|
||||||
/* parse the format_spec */
|
/* parse the format_spec */
|
||||||
if (!parse_internal_render_format_spec(format_spec, format_spec_len,
|
if (!parse_internal_render_format_spec(format_spec, format_spec_len,
|
||||||
&format, 's'))
|
&format, 's', '<'))
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
/* type conversion? */
|
/* type conversion? */
|
||||||
|
@ -1306,7 +1336,7 @@ format_int_or_long(PyObject* obj,
|
||||||
/* parse the format_spec */
|
/* parse the format_spec */
|
||||||
if (!parse_internal_render_format_spec(format_spec,
|
if (!parse_internal_render_format_spec(format_spec,
|
||||||
format_spec_len,
|
format_spec_len,
|
||||||
&format, 'd'))
|
&format, 'd', '>'))
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
/* type conversion? */
|
/* type conversion? */
|
||||||
|
@ -1417,7 +1447,7 @@ FORMAT_FLOAT(PyObject *obj,
|
||||||
/* parse the format_spec */
|
/* parse the format_spec */
|
||||||
if (!parse_internal_render_format_spec(format_spec,
|
if (!parse_internal_render_format_spec(format_spec,
|
||||||
format_spec_len,
|
format_spec_len,
|
||||||
&format, '\0'))
|
&format, '\0', '>'))
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
/* type conversion? */
|
/* type conversion? */
|
||||||
|
@ -1465,7 +1495,7 @@ FORMAT_COMPLEX(PyObject *obj,
|
||||||
/* parse the format_spec */
|
/* parse the format_spec */
|
||||||
if (!parse_internal_render_format_spec(format_spec,
|
if (!parse_internal_render_format_spec(format_spec,
|
||||||
format_spec_len,
|
format_spec_len,
|
||||||
&format, '\0'))
|
&format, '\0', '>'))
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
/* type conversion? */
|
/* type conversion? */
|
||||||
|
|
Loading…
Reference in New Issue