~canonical-django/canonical-django/project-template

« back to all changes in this revision

Viewing changes to trunk/python-packages/django/contrib/humanize/templatetags/humanize.py

  • Committer: Matthew Nuzum
  • Date: 2008-11-13 05:46:03 UTC
  • Revision ID: matthew.nuzum@canonical.com-20081113054603-v0kvr6z6xyexvqt3
adding to version control

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
from django.utils.translation import ungettext, ugettext as _
 
2
from django.utils.encoding import force_unicode
 
3
from django import template
 
4
from django.template import defaultfilters
 
5
from datetime import date
 
6
import re
 
7
 
 
8
register = template.Library()
 
9
 
 
10
def ordinal(value):
 
11
    """
 
12
    Converts an integer to its ordinal as a string. 1 is '1st', 2 is '2nd',
 
13
    3 is '3rd', etc. Works for any integer.
 
14
    """
 
15
    try:
 
16
        value = int(value)
 
17
    except ValueError:
 
18
        return value
 
19
    t = (_('th'), _('st'), _('nd'), _('rd'), _('th'), _('th'), _('th'), _('th'), _('th'), _('th'))
 
20
    if value % 100 in (11, 12, 13): # special case
 
21
        return u"%d%s" % (value, t[0])
 
22
    return u'%d%s' % (value, t[value % 10])
 
23
ordinal.is_safe = True
 
24
register.filter(ordinal)
 
25
 
 
26
def intcomma(value):
 
27
    """
 
28
    Converts an integer to a string containing commas every three digits.
 
29
    For example, 3000 becomes '3,000' and 45000 becomes '45,000'.
 
30
    """
 
31
    orig = force_unicode(value)
 
32
    new = re.sub("^(-?\d+)(\d{3})", '\g<1>,\g<2>', orig)
 
33
    if orig == new:
 
34
        return new
 
35
    else:
 
36
        return intcomma(new)
 
37
intcomma.is_safe = True
 
38
register.filter(intcomma)
 
39
 
 
40
def intword(value):
 
41
    """
 
42
    Converts a large integer to a friendly text representation. Works best for
 
43
    numbers over 1 million. For example, 1000000 becomes '1.0 million', 1200000
 
44
    becomes '1.2 million' and '1200000000' becomes '1.2 billion'.
 
45
    """
 
46
    value = int(value)
 
47
    if value < 1000000:
 
48
        return value
 
49
    if value < 1000000000:
 
50
        new_value = value / 1000000.0
 
51
        return ungettext('%(value).1f million', '%(value).1f million', new_value) % {'value': new_value}
 
52
    if value < 1000000000000:
 
53
        new_value = value / 1000000000.0
 
54
        return ungettext('%(value).1f billion', '%(value).1f billion', new_value) % {'value': new_value}
 
55
    if value < 1000000000000000:
 
56
        new_value = value / 1000000000000.0
 
57
        return ungettext('%(value).1f trillion', '%(value).1f trillion', new_value) % {'value': new_value}
 
58
    return value
 
59
intword.is_safe = False
 
60
register.filter(intword)
 
61
 
 
62
def apnumber(value):
 
63
    """
 
64
    For numbers 1-9, returns the number spelled out. Otherwise, returns the
 
65
    number. This follows Associated Press style.
 
66
    """
 
67
    try:
 
68
        value = int(value)
 
69
    except ValueError:
 
70
        return value
 
71
    if not 0 < value < 10:
 
72
        return value
 
73
    return (_('one'), _('two'), _('three'), _('four'), _('five'), _('six'), _('seven'), _('eight'), _('nine'))[value-1]
 
74
apnumber.is_safe = True
 
75
register.filter(apnumber)
 
76
 
 
77
def naturalday(value, arg=None):
 
78
    """
 
79
    For date values that are tomorrow, today or yesterday compared to
 
80
    present day returns representing string. Otherwise, returns a string
 
81
    formatted according to settings.DATE_FORMAT.
 
82
    """
 
83
    try: 
 
84
        value = date(value.year, value.month, value.day)
 
85
    except AttributeError:
 
86
        # Passed value wasn't a date object
 
87
        return value
 
88
    except ValueError:
 
89
        # Date arguments out of range
 
90
        return value
 
91
    delta = value - date.today()
 
92
    if delta.days == 0:
 
93
        return _(u'today')
 
94
    elif delta.days == 1:
 
95
        return _(u'tomorrow')
 
96
    elif delta.days == -1:
 
97
        return _(u'yesterday')
 
98
    return defaultfilters.date(value, arg)
 
99
register.filter(naturalday)