Skip to content

Commit 2d5704b

Browse files
author
fhgffy
committed
Choose ordinal suffixes from the absolute value.
Negative integers use a non-negative remainder in Python, so -21 was rendered as -21th instead of -21st.
1 parent 6ed367f commit 2d5704b

2 files changed

Lines changed: 15 additions & 1 deletion

File tree

‎src/humanize/number.py‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,10 @@ def ordinal(value: NumberOrString, gender: str = "male") -> str:
136136
except (TypeError, ValueError):
137137
return str(value)
138138
gender = "male" if gender == "male" else "female"
139-
digit = 0 if value % 100 in (11, 12, 13) else value % 10
139+
# Suffixes follow the absolute value. Python's % on a negative number
140+
# is not the last digit, so -21 used to render as "-21th".
141+
suffix_value = abs(value)
142+
digit = 0 if suffix_value % 100 in (11, 12, 13) else suffix_value % 10
140143
return f"{value}{P_(*_ORDINAL_SUFFIXES[gender][digit])}"
141144

142145

‎tests/test_number.py‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,17 @@
2525
("102", "102nd"),
2626
("103", "103rd"),
2727
("111", "111th"),
28+
(-1, "-1st"),
29+
(-2, "-2nd"),
30+
(-3, "-3rd"),
31+
(-11, "-11th"),
32+
(-12, "-12th"),
33+
(-13, "-13th"),
34+
(-21, "-21st"),
35+
(-22, "-22nd"),
36+
(-23, "-23rd"),
37+
(-101, "-101st"),
38+
(-111, "-111th"),
2839
("something else", "something else"),
2940
(None, "None"),
3041
(math.nan, "NaN"),

0 commit comments

Comments
 (0)