diff --git a/src/humanize/number.py b/src/humanize/number.py index e1fcaf4..ac134e3 100644 --- a/src/humanize/number.py +++ b/src/humanize/number.py @@ -117,6 +117,8 @@ def intcomma(value: NumberOrString, ndigits: int | None = None) -> str: '1,234.55' >>> intcomma(14308.40, 1) '14,308.4' + >>> intcomma("14308.40", 1) + '14,308.4' >>> intcomma(None) 'None' @@ -131,7 +133,11 @@ def intcomma(value: NumberOrString, ndigits: int | None = None) -> str: sep = thousands_separator() try: if isinstance(value, str): - float(value.replace(sep, "")) + value = value.replace(sep, "") + if "." in value: + value = float(value) + else: + value = int(value) else: float(value) except (TypeError, ValueError): @@ -141,12 +147,11 @@ def intcomma(value: NumberOrString, ndigits: int | None = None) -> str: orig = "{0:.{1}f}".format(value, ndigits) else: orig = str(value) - - new = re.sub(r"^(-?\d+)(\d{3})", rf"\g<1>{sep}\g<2>", orig) - if orig == new: - return new - - return intcomma(new) + while True: + new = re.sub(r"^(-?\d+)(\d{3})", rf"\g<1>{sep}\g<2>", orig) + if orig == new: + return new + orig = new powers = [10**x for x in (3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 100)] diff --git a/tests/test_number.py b/tests/test_number.py index 7022fd6..b429931 100644 --- a/tests/test_number.py +++ b/tests/test_number.py @@ -46,6 +46,10 @@ def test_ordinal(test_input: str, expected: str) -> None: (["10311"], "10,311"), (["1000000"], "1,000,000"), (["1234567.1234567"], "1,234,567.1234567"), + (["1234567.1234567", 0], "1,234,567"), + (["1234567.1234567", 1], "1,234,567.1"), + (["1234567.1234567", 10], "1,234,567.1234567000"), + (["1234567", 1], "1,234,567.0"), ([None], "None"), ([14308.40], "14,308.4"), ([14308.40, None], "14,308.4"),