Re: [Django] #34014: django.forms.fields.DecimalValidator fails to validate 0 in scientific notation (0E+1 or 0E+2)

3 views
Skip to first unread message

Django

unread,
Sep 15, 2022, 3:40:27 PM9/15/22
to django-...@googlegroups.com
#34014: django.forms.fields.DecimalValidator fails to validate 0 in scientific
notation (0E+1 or 0E+2)
-------------------------------------+-------------------------------------
Reporter: Shiplu Mokaddim | Owner: nobody
Type: Bug | Status: new
Component: Forms | Version: 2.0
Severity: Normal | Resolution:
Keywords: DecimalValidator, | Triage Stage:
Decimal, DecimalField | Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Description changed by Shiplu Mokaddim:

Old 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.
>
> {{{#!python
> 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))
> }}}

New description:

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.

{{{#!python
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))
}}}

--

--
Ticket URL: <https://code.djangoproject.com/ticket/34014#comment:2>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Reply all
Reply to author
Forward
0 new messages