From 87cd3dfa55770e5a987d43797c013d81530083db Mon Sep 17 00:00:00 2001 From: Marc Garcia Date: Wed, 1 Jul 2009 23:10:57 +0000 Subject: [soc2009/i18n] implemented more efficient way to get formats git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2009/i18n-improvements@11147 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/admin/templatetags/admin_list.py | 21 ++++++--------- django/contrib/databrowse/datastructures.py | 11 +++----- django/utils/formats.py | 26 +++++++++++++++++++ django/utils/numberformat.py | 34 +++++++++++++++++++++++++ 4 files changed, 72 insertions(+), 20 deletions(-) create mode 100644 django/utils/numberformat.py diff --git a/django/contrib/admin/templatetags/admin_list.py b/django/contrib/admin/templatetags/admin_list.py index 4b56652b45..f2d9a9342d 100644 --- a/django/contrib/admin/templatetags/admin_list.py +++ b/django/contrib/admin/templatetags/admin_list.py @@ -3,7 +3,7 @@ from django.contrib.admin.views.main import ALL_VAR, EMPTY_CHANGELIST_VALUE from django.contrib.admin.views.main import ORDER_VAR, ORDER_TYPE_VAR, PAGE_VAR, SEARCH_VAR from django.core.exceptions import ObjectDoesNotExist from django.db import models -from django.utils import dateformat +from django.utils import formats from django.utils.html import escape, conditional_escape from django.utils.text import capfirst from django.utils.safestring import mark_safe @@ -185,15 +185,12 @@ def items_for_result(cl, result, form): # Dates and times are special: They're formatted in a certain way. elif isinstance(f, models.DateField) or isinstance(f, models.TimeField): if field_val: - date_format = getformat('DATE_FORMAT') - datetime_format = getformat('DATETIME_FORMAT') - time_format = getformat('TIME_FORMAT') if isinstance(f, models.DateTimeField): - result_repr = capfirst(dateformat.format(field_val, datetime_format)) + result_repr = capfirst(formats.date_and_time_format(field_val, 'DATETIME_FORMAT')) elif isinstance(f, models.TimeField): - result_repr = capfirst(dateformat.time_format(field_val, time_format)) + result_repr = capfirst(formats.date_and_time_format(field_val, 'TIME_FORMAT')) else: - result_repr = capfirst(dateformat.format(field_val, date_format)) + result_repr = capfirst(formats.format(field_val, 'DATE_FORMAT')) else: result_repr = EMPTY_CHANGELIST_VALUE row_class = ' class="nowrap"' @@ -266,8 +263,6 @@ def date_hierarchy(cl): year_lookup = cl.params.get(year_field) month_lookup = cl.params.get(month_field) day_lookup = cl.params.get(day_field) - year_month_format = getformat('YEAR_MONTH_FORMAT') - month_day_format = getformat('MONTH_DAY_FORMAT') link = lambda d: mark_safe(cl.get_query_string(d, [field_generic])) @@ -277,9 +272,9 @@ def date_hierarchy(cl): 'show': True, 'back': { 'link': link({year_field: year_lookup, month_field: month_lookup}), - 'title': dateformat.format(day, year_month_format) + 'title': formats.date_and_time_format(day, 'YEAR_MONTH_FORMAT') }, - 'choices': [{'title': dateformat.format(day, month_day_format)}] + 'choices': [{'title': formats.date_and_time_format(day, 'MONTH_DAY_FORMAT')}] } elif year_lookup and month_lookup: days = cl.query_set.filter(**{year_field: year_lookup, month_field: month_lookup}).dates(field_name, 'day') @@ -291,7 +286,7 @@ def date_hierarchy(cl): }, 'choices': [{ 'link': link({year_field: year_lookup, month_field: month_lookup, day_field: day.day}), - 'title': dateformat.format(day, month_day_format) + 'title': formats.date_and_time_format(day, 'MONTH_DAY_FORMAT') } for day in days] } elif year_lookup: @@ -304,7 +299,7 @@ def date_hierarchy(cl): }, 'choices': [{ 'link': link({year_field: year_lookup, month_field: month.month}), - 'title': dateformat.format(month, year_month_format) + 'title': formats.date_and_time_format(month, 'YEAR_MONTH_FORMAT') } for month in months] } else: diff --git a/django/contrib/databrowse/datastructures.py b/django/contrib/databrowse/datastructures.py index 65e2fa49dd..5c69bbb0b9 100644 --- a/django/contrib/databrowse/datastructures.py +++ b/django/contrib/databrowse/datastructures.py @@ -4,7 +4,7 @@ convenience functionality and permalink functions for the databrowse app. """ from django.db import models -from django.utils import dateformat +from django.utils import formats from django.utils.text import capfirst from django.utils.encoding import smart_unicode, smart_str, iri_to_uri from django.utils.safestring import mark_safe @@ -155,15 +155,12 @@ class EasyInstanceField(object): objs = dict(self.field.choices).get(self.raw_value, EMPTY_VALUE) elif isinstance(self.field, models.DateField) or isinstance(self.field, models.TimeField): if self.raw_value: - date_format = getformat('DATE_FORMAT') - datetime_format = getformat('DATETIME_FORMAT') - time_format = getformat('TIME_FORMAT') if isinstance(self.field, models.DateTimeField): - objs = capfirst(dateformat.format(self.raw_value, datetime_format)) + objs = capfirst(formats.date_and_time_format(self.raw_value, 'DATETIME_FORMAT')) elif isinstance(self.field, models.TimeField): - objs = capfirst(dateformat.time_format(self.raw_value, time_format)) + objs = capfirst(formats.date_and_time_format(self.raw_value, 'TIME_FORMAT')) else: - objs = capfirst(dateformat.format(self.raw_value, date_format)) + objs = capfirst(formats.date_and_time_format(self.raw_value, 'DATE_FORMAT')) else: objs = EMPTY_VALUE elif isinstance(self.field, models.BooleanField) or isinstance(self.field, models.NullBooleanField): diff --git a/django/utils/formats.py b/django/utils/formats.py index 5b9456aa96..32e8a3c46c 100644 --- a/django/utils/formats.py +++ b/django/utils/formats.py @@ -38,3 +38,29 @@ if settings.USE_I18N and settings.USE_FORMAT_I18N: else: getformat = getformat_null +def date_and_time_format(value, format): + import dateformat + return dateformat.format(value, getformat('DATE_FORMAT')) + +def date_format(value): + import dateformat + return dateformat.format(value, getformat('DATE_FORMAT')) + +def datetime_format(value): + import dateformat + return dateformat.format(value, getformat('DATE_FORMAT')) + +def time_format(value): + import dateformat + return dateformat.time_format(value, getformat('TIME_FORMAT')) + +def number_format(value): + import numberformat + return numberformat.format( + value, + getformat('DECIMAL_SEPARATOR'), + 2, # TODO: decide how to set decimal positions later + 3, # TODO: get it from formats + getformat('THOUSAND_SEPARATOR'), + ) + diff --git a/django/utils/numberformat.py b/django/utils/numberformat.py new file mode 100644 index 0000000000..0abf5b35c5 --- /dev/null +++ b/django/utils/numberformat.py @@ -0,0 +1,34 @@ +def format(number, decimal_sep, decimal_pos, groupping=0, thousand_sep=''): + """ + """ + # sign + if number < 0: + sign = '-' + else: + sign = '' + # decimal part + str_number = str(abs(number)) + if '.' in str_number: + int_part, dec_part = str_number.split('.') + dec_part = dec_part[:decimal_pos] + else: + int_part, dec_part = str_number, '' + dec_part = dec_part + ('0' * (decimal_pos - len(dec_part))) + if dec_part: dec_part = decimal_sep + dec_part + # groupping + if groupping: + int_part_gd = '' + for cnt, digit in enumerate(int_part[::-1]): + if cnt and not cnt % groupping: + int_part_gd += thousand_sep + int_part_gd += digit + int_part = int_part_gd[::-1] + + + return sign + int_part + dec_part + +if __name__ == '__main__': + import decimal + print format_number(-1000000, ',', 4, 3, '.') + print format_number(-100.100, ',', 4, 3, '.') + print format_number(decimal.Decimal('1000.100'), ',', 4) -- cgit v1.3