from django import forms from django.core.exceptions import ValidationError import re from decimal import Decimal, InvalidOperation #class CurrencyField(forms.IntegerField): # default_error_message = { # 'invalid': _(u'Enter a number.'), # } # def __init__(self, positive=True, *args, **kwargs): # super(IntegerField, self).__init__(*args, **kwargs) # self.positive = positive # def to_python(self, value): # value = super(IntegerField, self).to_python(value) # if value in validators.EMPTY_VALUES: # return None # try: # value = float(value.replace(",", ".")) # except: # pass class CurrencyInput (forms.TextInput): def render(self, name, value, attrs=None): if value != '': try: value = u"%.2f" % value except TypeError: pass return super(CurrencyInput, self).render(name, value, attrs) class CurrencyField (forms.RegexField): widget = CurrencyInput currencyRe = re.compile(r'^[0-9]{1,5}([,\.][0-9][0-9]?)?$') #currencyRe = re.compile(r'^[0-9]{1,5}(.[0-9][0-9]?)?$') # currencyRe = re.compile(r"^[0-9]") def __init__(self, *args, **kwargs): super(CurrencyField, self).__init__( self.currencyRe, None, None, *args, **kwargs) #class CurrencyField(forms.FloatField): # widget = CurrencyInput # moneyre = re.compile(r"^[0-9]{1,5}([\.][0-9][0-9])?$") # def __init__(self, positive=False, allowPerCent=False, *args, **kwargs): # super(forms.FloatField, self).__init__(*args, **kwargs) # self.positive = positive # self.allowPerCent = allowPerCent def to_python(self, value): #return super(forms.FloatField, self).to_python(value) #raise ValidationError("WTF WTF WTF %s " % value) #value = value.replace(",", ".") #try: # value = super(forms.FloatField, self).to_python(value) #except ValidationError, e: # raise NotImplementedError("%s %s" % (e, value)) #return value value = value.replace(",", ".") try: value = Decimal(value) except (ValueError, TypeError, InvalidOperation): raise ValidationError("Bitte gib eine Zahl ein") # if not self.allowPerCent: # tmpval = 100.0*value # if tmpval == int(tmpval): # raise ValidationError("Deine Zahl sollte nicht mehr als zwei Nachkommastellen haben. %s %s %s" % (tmpval, int(tmpval), tmpval-int(tmpval))) # if self.positive and self.value < 0.0: # raise ValidationError("Bitte gib eine positive Zahl an.") return value def clean(self, value): value = super(CurrencyField, self).clean(value) return Decimal(value)