Opened 2 years ago
Closed 2 years ago
#34014 closed Bug (fixed)
DecimalValidator fails to validate 0 in scientific notation (0E+1 or 0E+2)
Reported by: | Shiplu Mokaddim | Owned by: | Kamil Turek |
---|---|---|---|
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 (8)
comment:1 by , 2 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 , 2 years ago
Description: | modified (diff) |
---|
comment:3 by , 2 years ago
Cc: | added |
---|---|
Component: | Forms → Core (Other) |
Summary: | django.forms.fields.DecimalValidator fails to validate 0 in scientific notation (0E+1 or 0E+2) → DecimalValidator fails to validate 0 in scientific notation (0E+1 or 0E+2) |
Triage Stage: | Unreviewed → Accepted |
comment:4 by , 2 years ago
Owner: | changed from | to
---|---|
Status: | new → assigned |
comment:6 by , 2 years ago
Triage Stage: | Ready for checkin → Accepted |
---|
You shouldn't mark your own PRs as RFC (see docs).
comment:7 by , 2 years ago
Triage Stage: | Accepted → Ready for checkin |
---|
Thanks for the report. We should fix an edge case with
0
, maybe:django/core/validators.py