From bd4e409695f8d6deebb1b3f70ffb9bc670477c2a Mon Sep 17 00:00:00 2001 From: Claude Paroz Date: Fri, 22 May 2020 20:39:47 +0200 Subject: [PATCH] Made intword/intcomma template filters independent of USE_L10N. --- .../contrib/humanize/templatetags/humanize.py | 77 ++++--------------- docs/releases/3.2.txt | 3 + 2 files changed, 20 insertions(+), 60 deletions(-) diff --git a/django/contrib/humanize/templatetags/humanize.py b/django/contrib/humanize/templatetags/humanize.py index 18a53adbe4..753a0d9fe1 100644 --- a/django/contrib/humanize/templatetags/humanize.py +++ b/django/contrib/humanize/templatetags/humanize.py @@ -3,7 +3,6 @@ from datetime import date, datetime from decimal import Decimal from django import template -from django.conf import settings from django.template import defaultfilters from django.utils.formats import number_format from django.utils.safestring import mark_safe @@ -63,14 +62,14 @@ def intcomma(value, use_l10n=True): Convert an integer to a string containing commas every three digits. For example, 3000 becomes '3,000' and 45000 becomes '45,000'. """ - if settings.USE_L10N and use_l10n: + if use_l10n: try: if not isinstance(value, (float, Decimal)): value = int(value) except (TypeError, ValueError): return intcomma(value, False) else: - return number_format(value, force_grouping=True) + return number_format(value, use_l10n=True, force_grouping=True) orig = str(value) new = re.sub(r"^(-?\d+)(\d{3})", r'\g<1>,\g<2>', orig) if orig == new: @@ -81,50 +80,17 @@ def intcomma(value, use_l10n=True): # A tuple of standard large number to their converters intword_converters = ( - (6, lambda number: ( - ngettext('%(value).1f million', '%(value).1f million', number), - ngettext('%(value)s million', '%(value)s million', number), - )), - (9, lambda number: ( - ngettext('%(value).1f billion', '%(value).1f billion', number), - ngettext('%(value)s billion', '%(value)s billion', number), - )), - (12, lambda number: ( - ngettext('%(value).1f trillion', '%(value).1f trillion', number), - ngettext('%(value)s trillion', '%(value)s trillion', number), - )), - (15, lambda number: ( - ngettext('%(value).1f quadrillion', '%(value).1f quadrillion', number), - ngettext('%(value)s quadrillion', '%(value)s quadrillion', number), - )), - (18, lambda number: ( - ngettext('%(value).1f quintillion', '%(value).1f quintillion', number), - ngettext('%(value)s quintillion', '%(value)s quintillion', number), - )), - (21, lambda number: ( - ngettext('%(value).1f sextillion', '%(value).1f sextillion', number), - ngettext('%(value)s sextillion', '%(value)s sextillion', number), - )), - (24, lambda number: ( - ngettext('%(value).1f septillion', '%(value).1f septillion', number), - ngettext('%(value)s septillion', '%(value)s septillion', number), - )), - (27, lambda number: ( - ngettext('%(value).1f octillion', '%(value).1f octillion', number), - ngettext('%(value)s octillion', '%(value)s octillion', number), - )), - (30, lambda number: ( - ngettext('%(value).1f nonillion', '%(value).1f nonillion', number), - ngettext('%(value)s nonillion', '%(value)s nonillion', number), - )), - (33, lambda number: ( - ngettext('%(value).1f decillion', '%(value).1f decillion', number), - ngettext('%(value)s decillion', '%(value)s decillion', number), - )), - (100, lambda number: ( - ngettext('%(value).1f googol', '%(value).1f googol', number), - ngettext('%(value)s googol', '%(value)s googol', number), - )), + (6, lambda number: ngettext('%(value)s million', '%(value)s million', number)), + (9, lambda number: ngettext('%(value)s billion', '%(value)s billion', number)), + (12, lambda number: ngettext('%(value)s trillion', '%(value)s trillion', number)), + (15, lambda number: ngettext('%(value)s quadrillion', '%(value)s quadrillion', number)), + (18, lambda number: ngettext('%(value)s quintillion', '%(value)s quintillion', number)), + (21, lambda number: ngettext('%(value)s sextillion', '%(value)s sextillion', number)), + (24, lambda number: ngettext('%(value)s septillion', '%(value)s septillion', number)), + (27, lambda number: ngettext('%(value)s octillion', '%(value)s octillion', number)), + (30, lambda number: ngettext('%(value)s nonillion', '%(value)s nonillion', number)), + (33, lambda number: ngettext('%(value)s decillion', '%(value)s decillion', number)), + (100, lambda number: ngettext('%(value)s googol', '%(value)s googol', number)), ) @@ -144,23 +110,14 @@ def intword(value): if abs_value < 1000000: return value - def _check_for_i18n(value, float_formatted, string_formatted): - """ - Use the i18n enabled defaultfilters.floatformat if possible - """ - if settings.USE_L10N: - value = defaultfilters.floatformat(value, 1) - template = string_formatted - else: - template = float_formatted - return template % {'value': value} - - for exponent, converters in intword_converters: + for exponent, converter in intword_converters: large_number = 10 ** exponent if abs_value < large_number * 1000: new_value = value / large_number rounded_value = round_away_from_one(new_value) - return _check_for_i18n(new_value, *converters(abs(rounded_value))) + return converter(abs(rounded_value)) % { + 'value': defaultfilters.floatformat(new_value, 1), + } return value diff --git a/docs/releases/3.2.txt b/docs/releases/3.2.txt index 5436726fa4..662fc889e5 100644 --- a/docs/releases/3.2.txt +++ b/docs/releases/3.2.txt @@ -283,6 +283,9 @@ Miscellaneous * :func:`~django.utils.text.slugify` now removes leading and trailing dashes and underscores. +* The :tfilter:`intcomma` and :tfilter:`intword` template filters no longer + depend on the :setting:`USE_L10N` setting. + .. _deprecated-features-3.2: Features deprecated in 3.2