Opened 3 years ago
Last modified 3 years ago
#34014 closed Bug
django.forms.fields.DecimalValidator fails to validate 0 in scientific notation (0E+1 or 0E+2) — at Version 2
| 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 (last modified by )
In 1.11.29 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 2.0.13 it raises ValidatorError.
>>> 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))
Change History (2)
comment:1 by , 3 years ago
| Summary: | django.forms.fields.DecimalValidator fails to validate 0 in scientific notation → django.forms.fields.DecimalValidator fails to validate 0 in scientific notation (0E+1 or 0E+2) |
|---|
comment:2 by , 3 years ago
| Description: | modified (diff) |
|---|