|
17 | 17 | # TODO: |
18 | 18 | # Padding and rounding increments in pattern: |
19 | 19 | # - https://www.unicode.org/reports/tr35/ (Appendix G.6) |
| 20 | +from __future__ import annotations |
20 | 21 | import decimal |
21 | 22 | import re |
22 | 23 | from datetime import date as date_, datetime as datetime_ |
@@ -431,7 +432,7 @@ def format_compact_decimal(number, *, format_type="short", locale=LC_NUMERIC, fr |
431 | 432 | u'123万' |
432 | 433 | >>> format_compact_decimal(2345678, format_type="long", locale="mk") |
433 | 434 | u'2 милиони' |
434 | | - >>> format_compact_decimal(21098765, format_type="long", locale="mk") |
| 435 | + >>> format_compact_decimal(21000000, format_type="long", locale="mk") |
435 | 436 | u'21 милион' |
436 | 437 |
|
437 | 438 | :param number: the number to format |
@@ -469,11 +470,15 @@ def _get_compact_format(number, compact_format, locale, fraction_digits=0): |
469 | 470 | # equal to the number of 0's in the pattern minus 1 |
470 | 471 | number = number / (magnitude // (10 ** (pattern.count("0") - 1))) |
471 | 472 | # round to the number of fraction digits requested |
472 | | - number = round(number, fraction_digits) |
| 473 | + rounded = round(number, fraction_digits) |
473 | 474 | # if the remaining number is singular, use the singular format |
474 | 475 | plural_form = locale.plural_form(abs(number)) |
475 | | - plural_form = plural_form if plural_form in compact_format else "other" |
| 476 | + if plural_form not in compact_format: |
| 477 | + plural_form = "other" |
| 478 | + if number == 1 and "1" in compact_format: |
| 479 | + plural_form = "1" |
476 | 480 | format = compact_format[plural_form][str(magnitude)] |
| 481 | + number = rounded |
477 | 482 | break |
478 | 483 | return number, format |
479 | 484 |
|
@@ -960,17 +965,19 @@ def parse_precision(p): |
960 | 965 | return NumberPattern(pattern, (pos_prefix, neg_prefix), |
961 | 966 | (pos_suffix, neg_suffix), grouping, |
962 | 967 | int_prec, frac_prec, |
963 | | - exp_prec, exp_plus) |
| 968 | + exp_prec, exp_plus, number) |
964 | 969 |
|
965 | 970 |
|
966 | 971 | class NumberPattern: |
967 | 972 |
|
968 | 973 | def __init__(self, pattern, prefix, suffix, grouping, |
969 | | - int_prec, frac_prec, exp_prec, exp_plus): |
| 974 | + int_prec, frac_prec, exp_prec, exp_plus, |
| 975 | + number_pattern: str | None = None): |
970 | 976 | # Metadata of the decomposed parsed pattern. |
971 | 977 | self.pattern = pattern |
972 | 978 | self.prefix = prefix |
973 | 979 | self.suffix = suffix |
| 980 | + self.number_pattern = number_pattern |
974 | 981 | self.grouping = grouping |
975 | 982 | self.int_prec = int_prec |
976 | 983 | self.frac_prec = frac_prec |
@@ -1115,7 +1122,7 @@ def apply( |
1115 | 1122 |
|
1116 | 1123 | retval = ''.join([ |
1117 | 1124 | self.prefix[is_negative], |
1118 | | - number, |
| 1125 | + number if self.number_pattern != '' else '', |
1119 | 1126 | self.suffix[is_negative]]) |
1120 | 1127 |
|
1121 | 1128 | if u'¤' in retval: |
|
0 commit comments