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

How to accept both dot and comma as a decimal separator with WTForms?

我使用 WTForms to display and validate form input. I use a DecimalField 作为金额输入,当插入一个以点作为小数分隔符的值时,它工作正常。然而,由于该网站将在欧洲大陆使用,我 想允许逗号作为小数点分隔符。这意味着 both "2.5" 和 "2,5" 的结果应该是 "two and a half".

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


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

您可以子类化 DecimalField 并在处理数据之前用句点替换逗号:

class FlexibleDecimalField(fields.DecimalField):

    def process_formdata(self, valuelist):
        if valuelist:
            valuelist[0] = valuelist[0].replace(",", ".")
        return super(FlexibleDecimalField, self).process_formdata(valuelist)
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',)