如何接受点和逗号作为 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',)
我使用 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',)