diff --git a/django/contrib/humanize/templatetags/humanize.py b/django/contrib/humanize/templatetags/humanize.py index 19000c185c..174e367a69 100644 --- a/django/contrib/humanize/templatetags/humanize.py +++ b/django/contrib/humanize/templatetags/humanize.py @@ -24,12 +24,14 @@ register = template.Library() def ordinal(value): """ Convert an integer to its ordinal as a string. 1 is '1st', 2 is '2nd', - 3 is '3rd', etc. Works for any integer. + 3 is '3rd', etc. Works for any non-negative integer. """ try: value = int(value) except (TypeError, ValueError): return value + if value < 0: + return str(value) if value % 100 in (11, 12, 13): # Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). value = pgettext("ordinal 11, 12, 13", "{}th").format(value) diff --git a/docs/ref/contrib/humanize.txt b/docs/ref/contrib/humanize.txt index 7c1af53ed3..1596f30b97 100644 --- a/docs/ref/contrib/humanize.txt +++ b/docs/ref/contrib/humanize.txt @@ -143,3 +143,4 @@ Examples: * ``3`` becomes ``3rd``. You can pass in either an integer or a string representation of an integer. +Negative integers are returned unchanged. diff --git a/tests/humanize_tests/tests.py b/tests/humanize_tests/tests.py index 5e4f7f0ef7..ab967e2874 100644 --- a/tests/humanize_tests/tests.py +++ b/tests/humanize_tests/tests.py @@ -55,6 +55,9 @@ class HumanizeTests(SimpleTestCase): "102", "103", "111", + "-0", + "-1", + "-105", "something else", None, ) @@ -70,6 +73,9 @@ class HumanizeTests(SimpleTestCase): "102nd", "103rd", "111th", + "0th", + "-1", + "-105", "something else", None, )