aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python/formatter_unicode.c
diff options
context:
space:
mode:
authorSergey B Kirpichev <skirpichev@gmail.com>2025-03-06 15:26:29 +0300
committerGitHub <noreply@github.com>2025-03-06 14:26:29 +0200
commit2352bd418a7a0c38f8ea135bd1879937d90ecce1 (patch)
tree38cc9999f45697a128e87bb3c7f1388139ed32bc /Python/formatter_unicode.c
parent10cdd7f91ff45737e409a2e2c58fd8a9aa7c5a16 (diff)
downloadcpython-2352bd418a7a0c38f8ea135bd1879937d90ecce1.tar.gz
cpython-2352bd418a7a0c38f8ea135bd1879937d90ecce1.zip
gh-130860: Fix width calculation, when separators in fractional part (GH-130865)
This amends f39a07be47
Diffstat (limited to 'Python/formatter_unicode.c')
-rw-r--r--Python/formatter_unicode.c35
1 files changed, 18 insertions, 17 deletions
diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c
index 6e3dcb3dd66..dcfff2f5bc7 100644
--- a/Python/formatter_unicode.c
+++ b/Python/formatter_unicode.c
@@ -578,6 +578,22 @@ calc_number_widths(NumberFieldWidths *spec, Py_ssize_t n_prefix,
}
}
+ if (spec->n_frac == 0) {
+ spec->n_grouped_frac_digits = 0;
+ }
+ else {
+ Py_UCS4 grouping_maxchar;
+ spec->n_grouped_frac_digits = _PyUnicode_InsertThousandsGrouping(
+ NULL, 0,
+ NULL, 0, spec->n_frac,
+ spec->n_frac,
+ locale->grouping, locale->frac_thousands_sep, &grouping_maxchar, 1);
+ if (spec->n_grouped_frac_digits == -1) {
+ return -1;
+ }
+ *maxchar = Py_MAX(*maxchar, grouping_maxchar);
+ }
+
/* The number of chars used for non-digits and non-padding. */
n_non_digit_non_padding = spec->n_sign + spec->n_prefix + spec->n_decimal +
+ spec->n_frac + spec->n_remainder;
@@ -585,7 +601,8 @@ calc_number_widths(NumberFieldWidths *spec, Py_ssize_t n_prefix,
/* min_width can go negative, that's okay. format->width == -1 means
we don't care. */
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
+ + spec->n_frac - spec->n_grouped_frac_digits);
else
spec->n_min_width = 0;
@@ -607,22 +624,6 @@ calc_number_widths(NumberFieldWidths *spec, Py_ssize_t n_prefix,
*maxchar = Py_MAX(*maxchar, grouping_maxchar);
}
- if (spec->n_frac == 0) {
- spec->n_grouped_frac_digits = 0;
- }
- else {
- Py_UCS4 grouping_maxchar;
- spec->n_grouped_frac_digits = _PyUnicode_InsertThousandsGrouping(
- NULL, 0,
- NULL, 0, spec->n_frac,
- spec->n_frac,
- locale->grouping, locale->frac_thousands_sep, &grouping_maxchar, 1);
- if (spec->n_grouped_frac_digits == -1) {
- return -1;
- }
- *maxchar = Py_MAX(*maxchar, grouping_maxchar);
- }
-
/* Given the desired width and the total of digit and non-digit
space we consume, see if we need any padding. format->width can
be negative (meaning no padding), but this code still works in