如何使用WTForms接受点和逗号作为小数分隔符?

时间:2015-01-20 23:43:10

标签: python decimal wtforms

我正在使用WTForms来显示和验证表单输入。我使用DecimalField作为金额输入,当插入带点作为小数分隔符的值时,它可以正常工作。由于此网站将在欧洲大陆使用,我希望允许逗号作为小数分隔符。这意味着 “2.5”和“2,5”都应该产生一个意思是“两个半”的值。

当我用逗号输入值时,我收到错误'Not a valid decimal value'。如何使用WTForms接受点和逗号作为小数分隔符?


我知道我可以使用Babel来使用基于区域设置的数字格式,但我不希望这样。我特别想接受点和逗号作为分隔符值。

2 个答案:

答案 0 :(得分:6)

您可以继承DecimalField并在处理数据之前用逗号替换逗号:

class FlexibleDecimalField(fields.DecimalField):

    def process_formdata(self, valuelist):
        if valuelist:
            valuelist[0] = valuelist[0].replace(",", ".")
        return super(FlexibleDecimalField, self).process_formdata(valuelist)

答案 1 :(得分:0)

class FlexibleDecimalField(forms.DecimalField):

    def to_python(self, value):
        # check decimal symbol
        comma_index = 0
        dot_index = 0
        try:
            comma_index = value.index(',')
        except ValueError:
            pass
        try:
            dot_index = value.index('.')
        except ValueError:
            pass
        if value:
            if comma_index > dot_index:
                value = value.replace('.', '').replace(',', '.')
        return super(FlexibleDecimalField, self).to_python(value)

class FooForm(forms.ModelForm):
    discount_value = FlexibleDecimalField(decimal_places=2, max_digits=8)

    class Meta:
        model = Foo
        fields = ('discount_value',)