From 32917bf748a7e9f5ff6987d1a7f397a4fb024cb8 Mon Sep 17 00:00:00 2001 From: Sreekant Baheti <60787859+Sreekant13@users.noreply.github.com> Date: Mon, 13 Jul 2026 17:26:31 -0700 Subject: [PATCH] Fix fractional(0) returning "0/1" instead of "0" fractional() gated the whole-number return on `whole_number` being truthy, so 0 (where whole_number == 0) fell through to the fraction branch and rendered as "0/1". Since `numerator == 0 and denominator == 1` already uniquely identifies a whole number (including 0), drop the redundant `whole_number and`. Now fractional(0) returns "0". Added regression test cases. --- src/humanize/number.py | 4 ++-- tests/test_number.py | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/humanize/number.py b/src/humanize/number.py index 2fb22c6..007ab9b 100644 --- a/src/humanize/number.py +++ b/src/humanize/number.py @@ -361,9 +361,9 @@ def fractional(value: NumberOrString) -> str: frac = Fraction(number - whole_number).limit_denominator(1000) numerator = frac.numerator denominator = frac.denominator - if whole_number and not numerator and denominator == 1: + if not numerator and denominator == 1: # this means that an integer was passed in - # (or variants of that integer like 1.0000) + # (or variants of that integer like 1.0000, and including 0) return f"{whole_number:.0f}" if not whole_number: diff --git a/tests/test_number.py b/tests/test_number.py index 78639c3..7264e87 100644 --- a/tests/test_number.py +++ b/tests/test_number.py @@ -169,6 +169,8 @@ def test_apnumber(test_input: int | str, expected: str) -> None: [ (1, "1"), (2.0, "2"), + (0, "0"), + (0.0, "0"), (4.0 / 3.0, "1 1/3"), (5.0 / 6.0, "5/6"), ("7", "7"),