Opened 2 years ago
Last modified 2 years ago
#34014 closed Bug
django.forms.fields.DecimalValidator fails to validate 0 in scientific notation — at Initial Version
Reported by: | Shiplu Mokaddim | Owned by: | nobody |
---|---|---|---|
Component: | Core (Other) | Version: | 2.0 |
Severity: | Normal | Keywords: | DecimalValidator, Decimal, DecimalField |
Cc: | Josh Schneier | Triage Stage: | Ready for checkin |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
In django 1.11 DecimalValidator treats 0E+1
as valid decimal
>>> from django.forms.fields import DecimalField >>> DecimalField(max_digits=8, decimal_places=7).clean('0E+1') Decimal('0E+1')
But in django 2.0.13 it raises validator error.
>>> DecimalField(max_digits=8, decimal_places=7).clean('0E+1') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/amokaddim/e/fh/lib/python3.8/site-packages/django/forms/fields.py", line 150, in clean self.run_validators(value) File "/Users/amokaddim/e/fh/lib/python3.8/site-packages/django/forms/fields.py", line 141, in run_validators raise ValidationError(errors) django.core.exceptions.ValidationError: <exception str() failed>
This was introduced in https://github.com/django/django/commit/7c6590af5f199c9ede970758877b5c1eb7e9b3a6#diff-d9609d8dc8482b30eac30df16213cba134562949fd62c97573927b89e880f85b
Is there any way I can prevent this validation error from happening in Django 2.0? Any flag or option that will prevent this?
Calling Decimal('0E+1').normalize()
inside to_python
method solves the problem. But that's a workaround!
Here is a reproducible test case.
from unittest import TestCase from decimal import Decimal from django.core.validators import DecimalValidator from django.core.exceptions import ValidationError class Test(TestCase): def test(self): value = '0E+1' validator = DecimalValidator(8, 7) try: validator(Decimal(value)) except ValidationError: self.fail("'{}' is an invalid decimal".format(value))