Skip to content

Commit efffb31

Browse files
authored
Merge pull request #771 from Zhuyuyangyy/fix/fractional-zero-whole-number
fix: format exact zero as a whole number in fractional
2 parents a58349e + cac03c8 commit efffb31

3 files changed

Lines changed: 17 additions & 1 deletion

File tree

‎docs/usage.md‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,9 @@ human_readable.fractional(1.5)
344344

345345
human_readable.fractional(0.3)
346346
"3/10"
347+
348+
human_readable.fractional(0.0)
349+
"0"
347350
```
348351

349352
### Scientific notation

‎src/human_readable/numbers.py‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,8 @@ def fractional(value: str | float) -> str:
191191
'1/3'
192192
>>> fractional(1)
193193
'1'
194+
>>> fractional(0.0)
195+
'0'
194196
195197
This will always return a string.
196198
@@ -202,6 +204,8 @@ def fractional(value: str | float) -> str:
202204
203205
"""
204206
number = float(value)
207+
if number == 0:
208+
return "0"
205209
whole_number = int(number)
206210
frac = fractions.Fraction(number - whole_number).limit_denominator(1000)
207211
numerator = frac.numerator

‎tests/unit/test_numbers.py‎

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,21 @@ def test_ap_number(params: int, expected: str) -> None:
7777
[
7878
(1, "1"), # whole number int
7979
(2.0, "2"), # whole number float
80+
(0, "0"), # zero integer
81+
(0.0, "0"), # zero float
82+
(-0.0, "0"), # negative zero float
83+
("0", "0"), # zero string
84+
(-2, "-2"), # negative whole number
8085
(5 / 6.0, "5/6"), # simple fraction
8186
(8.9, "8 9/10"), # compound fraction
8287
("8.9", "8 9/10"), # string fraction
88+
(-0.5, "-1/2"), # negative fraction
89+
(-1.5, "-1 -1/2"), # negative compound fraction
90+
(0.3333333, "1/3"), # limited denominator approximation
91+
(0.0001, "0/1"), # nonzero value rounded to zero by denominator limit
8392
],
8493
)
85-
def test_fractional(params: int, expected: str) -> None:
94+
def test_fractional(params: str | float, expected: str) -> None:
8695
"""Fractional number tests."""
8796
assert numbers.fractional(params) == expected
8897

0 commit comments

Comments
 (0)