Skip to content

Commit 0fe540d

Browse files
committed
Fix fractional() emitting degenerate output when the fraction rounds to a whole
When limit_denominator(1000) reduces the fractional part to a whole number (denominator == 1), fold it into the integer part instead of printing a degenerate "N/1". For example fractional(2.9999999) returned "2 1/1" instead of "3", fractional(0.9999999) returned "1/1" instead of "1", and fractional(0) returned "0/1" instead of "0".
1 parent c3a124c commit 0fe540d

2 files changed

Lines changed: 11 additions & 4 deletions

File tree

src/humanize/number.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -361,10 +361,12 @@ def fractional(value: NumberOrString) -> str:
361361
frac = Fraction(number - whole_number).limit_denominator(1000)
362362
numerator = frac.numerator
363363
denominator = frac.denominator
364-
if whole_number and not numerator and denominator == 1:
365-
# this means that an integer was passed in
366-
# (or variants of that integer like 1.0000)
367-
return f"{whole_number:.0f}"
364+
if denominator == 1:
365+
# The fractional part reduced to a whole number: either an integer
366+
# was passed in (e.g. 1 or 1.0000, giving 0/1), or the fractional part
367+
# rounded up to 1/1 (e.g. 2.9999999). Fold it into the integer part
368+
# instead of emitting a degenerate "0/1" or "2 1/1".
369+
return f"{whole_number + numerator:.0f}"
368370

369371
if not whole_number:
370372
return f"{numerator:.0f}/{denominator:.0f}"

tests/test_number.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,11 @@ def test_apnumber(test_input: int | str, expected: str) -> None:
187187
(-1.3, "-1 3/10"),
188188
(-2.5, "-2 1/2"),
189189
(-0.5, "-1/2"),
190+
(0, "0"),
191+
(0.0, "0"),
192+
(2.9999999, "3"),
193+
(0.9999999, "1"),
194+
(-2.9999999, "-3"),
190195
],
191196
)
192197
def test_fractional(test_input: float | str, expected: str) -> None:

0 commit comments

Comments
 (0)