#7726: DecimalField: Semantics of max_digits in combination with decimal_places confusing and perhaps wrong --------------------------+------------------------------------------------- Reporter: theevilgeek | Owner: nobody Status: new | Milestone: Component: Validators | Version: SVN Keywords: DecimalField | Stage: Unreviewed Has_patch: 0 | --------------------------+------------------------------------------------- '''"Problem"'''
In attempting to capture fixed point decimal values in the range of .0000 to .9999, I created a DecimalField as follows: value = forms.DecimalField(max_digits=4, decimal_places=4) However, it seems that any decimal submitted is first normalized to include a leading "0." should no other non-fractional digits be provided. The presence of this additional "0." causes the input to instead resemble 0.XXXX. However, since decimal_places = 4 and max_digits = 4, no input will successfully validate-- the leading zero simply hasn't been accounted for. '''Possible solutions''' 1. irc:Gulopine and irc:Magus suggest that this behavior is not a problem: a properly formatted decimal lacking a whole component incorporates a leading "0."; thus, the user should anticipate this extra digit and plan accordingly. However, the documentation for the DecimalField (http://www.djangoproject.com/documentation/model-api/#decimalfield [treating the model and newforms fields as being interchangeable]) indicates that the field stores a "A fixed-precision decimal number". As fixed-precision (or fixed-point) decimal notation usually implies exacting control over the number of positions before and after the decimal point that will be incorporated in a representation of the data (http://en.wikipedia.org/wiki/Fixed-point_arithmetic), it seems reasonable to expect that the DecimalField will exactingly respect the max_digits and decimal_places arguments to the same effect. Thus, I feel that the exhibited behavior is, at the least, somewhat surprising. 2. irc:Gulopine suggests that DecimalField might be altered to raise an ImproperlyConfigured error if max_digits <= decimal_places. 3. The DecimalField documentation might be enhanced to explicitly state that a leading "0." will be tacked onto any decimal numbers lacking whole digits and that this leading zero must be accounted for when specifying max_digits and decimal_places. 4. The behavior of DecimalField is altered such that max_digits and decimal_places are strictly enforced. Finally, it is worth noting that the examples in the documentation for DecimalField only reinforce the expectation of strict enforcement: "For example, to store numbers up to 999 with a resolution of 2 decimal places, you’d use: models.DecimalField(..., max_digits=5, decimal_places=2)" -- Ticket URL: <http://code.djangoproject.com/ticket/7726> Django Code <http://code.djangoproject.com/> The web framework for perfectionists with deadlines --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django updates" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/django-updates?hl=en -~----------~----~----~----~------~----~------~--~---
