Package django :: Package contrib :: Package humanize :: Package templatetags :: Module humanize
[hide private]
[frames] | no frames]

Source Code for Module django.contrib.humanize.templatetags.humanize

  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) 100