Login

(en-US) Humanized Decimal Field

Author:
ActionScripted
Posted:
July 1, 2008
Language:
Python
Version:
.96
Tags:
comma field decimal separator input humanize thousands form
Score:
3 (after 3 ratings)

Simple DecimalField class extension that automatically adds formatting and validation for comma-separated "decimals". Works wonderfully for price fields.

Could be extended to strip dollar signs or to be locale-agnostic.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
""" Stay DRY, import intcomma """
from django.contrib.humanize.templatetags.humanize import intcomma


class USDecimalHumanizedInput(forms.TextInput):
  def __init__(self, initial=None, *args, **kwargs):
    super(USDecimalHumanizedInput, self).__init__(*args, **kwargs)
  
  def render(self, name, value, attrs=None):
    value = intcomma(value)
    return super(USDecimalHumanizedInput, self).render(name, value, attrs)


class USDecimalHumanizedField(forms.DecimalField):
  """
  Use this as a drop-in replacement for forms.DecimalField()
  """
  widget = USDecimalHumanizedInput
  
  def clean(self, value):
    value = value.replace(',','')
    super(USDecimalHumanizedField, self).clean(value)
    return value

More like this

Comments

ActionScripted (on July 2, 2008):
<p>I've noticed that when initializing without an explicit initial value, the field defaults to the string "None".</p> <p>Not sure how to change this, but it'd be great if it would just fall-back to an empty string ("").</p>

#

Davepar (on July 15, 2010):
<p>Line 22 should be:</p> <pre>value = super(USDecimalHumanizedField, self).clean(value) </pre> <p>Otherwise the value never gets turned into a Decimal type.</p>

#

hobbesdaboba (on June 14, 2011):
<p>Just in case anyone still uses this, to fix the "None" problem mentioned by ActionScripted, simply change line 10 so that:</p> <p>if value: value = intcomma(value) else: value = ''</p>

#

Please login first before commenting.