diff --git a/django/forms/fields.py b/django/forms/fields.py index 836cd5d33c..ccb54d8b32 100644 --- a/django/forms/fields.py +++ b/django/forms/fields.py @@ -254,12 +254,12 @@ class DecimalField(Field): decimals = abs(exponent) # digittuple doesn't include any leading zeros. digits = len(digittuple) - if decimals >= digits: + if decimals > digits: # We have leading zeros up to or past the decimal point. Count - # everything past the decimal point as a digit. We also add one - # for leading zeros before the decimal point (any number of leading - # whole zeros collapse to one digit). - digits = decimals + 1 + # everything past the decimal point as a digit. We do not count + # 0 before the decimal point as a digit since that would mean + # we would not allow max_digits = decimal_places. + digits = decimals whole_digits = digits - decimals if self.max_value is not None and value > self.max_value: diff --git a/tests/regressiontests/forms/fields.py b/tests/regressiontests/forms/fields.py index f31ea6fa20..1b5d7a3b68 100644 --- a/tests/regressiontests/forms/fields.py +++ b/tests/regressiontests/forms/fields.py @@ -366,7 +366,7 @@ True Traceback (most recent call last): ... ValidationError: [u'Ensure that there are no more than 2 decimal places.'] ->>> f.clean('-000.1234') +>>> f.clean('-000.12345') Traceback (most recent call last): ... ValidationError: [u'Ensure that there are no more than 4 digits in total.'] @@ -416,19 +416,20 @@ ValidationError: [u'Ensure that there are no more than 2 decimal places.'] # Leading whole zeros "collapse" to one digit. >>> f.clean('0000000.10') == Decimal("0.1") True ->>> f.clean('0000000.100') -Traceback (most recent call last): -... -ValidationError: [u'Ensure that there are no more than 3 digits in total.'] + +# But a leading 0 before the . doesn't count towards max_digits +>>> f.clean('0000000.100') == Decimal("0.100") +True # Only leading whole zeros "collapse" to one digit. >>> f.clean('000000.02') == Decimal('0.02') True ->>> f.clean('000000.002') +>>> f.clean('000000.0002') Traceback (most recent call last): ... ValidationError: [u'Ensure that there are no more than 3 digits in total.'] - +>>> f.clean('.002') == Decimal("0.002") +True # DateField ###################################################################