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
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):
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
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
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
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
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
87 return value
88 except ValueError:
89
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)
100