Commits

Anonymous committed 31764ef

Fixes #3176, #3004 -- Added an argument to the floatfilter to allow users to specify precision of floats, Thanks, Eric Floehr.

  • Participants
  • Parent commits eb1d452

Comments (0)

Files changed (4)

     Clint Ecker
     Enrico <rico.bl@gmail.com>
     favo@exoweb.net
+    Eric Floehr <eric@intellovations.com>
     gandalf@owca.info
     Baishampayan Ghose
     martin.glueck@gmail.com

django/template/defaultfilters.py

     from django.utils.html import fix_ampersands
     return fix_ampersands(value)
 
-def floatformat(text):
+def floatformat(text, arg=-1):
     """
-    Displays a floating point number as 34.2 (with one decimal place) -- but
-    only if there's a point to be displayed
+    If called without an argument, displays a floating point
+    number as 34.2 -- but only if there's a point to be displayed.
+    With a positive numeric argument, it displays that many decimal places
+    always.
+    With a negative numeric argument, it will display that many decimal
+    places -- but only if there's places to be displayed.
+    Examples:
+        num1 = 34.23234
+        num2 = 34.00000
+        num1|floatformat results in 34.2
+        num2|floatformat is 34
+        num1|floatformat:3 is 34.232
+        num2|floatformat:3 is 34.000
+        num1|floatformat:-3 is 34.232
+        num2|floatformat:-3 is 34
     """
     try:
         f = float(text)
     except ValueError:
         return ''
+    try:
+        d = int(arg)
+    except ValueError:
+        return str(f)
     m = f - int(f)
-    if m:
-        return '%.1f' % f
+    if not m and d < 0:
+        return '%d' % int(f)
     else:
-        return '%d' % int(f)
+        formatstr = '%%.%df' % abs(d)
+        return formatstr % f
 
 def linenumbers(value):
     "Displays text with line numbers"

docs/templates.txt

 floatformat
 ~~~~~~~~~~~
 
-Rounds a floating-point number to one decimal place -- but only if there's a
-decimal part to be displayed. For example:
+When used without an argument, rounds a floating-point number to one decimal
+place -- but only if there's a decimal part to be displayed. For example:
 
     * ``36.123`` gets converted to ``36.1``
     * ``36.15`` gets converted to ``36.2``
     * ``36`` gets converted to ``36``
 
+**New in Django development version**
+
+If used with a numeric integer argument, ``floatformat`` rounds a number to that 
+many decimal places.  For example:
+
+    * ``36.1234`` with floatformat:3 gets converted to ``36.123``
+    * ``36`` with floatformat:4 gets converted to ``36.0000``
+
+If the argument passed to ``floatformat`` is negative, it will round a number to
+that many decimal places -- but only if there's a decimal part to be displayed.
+For example:
+
+    * ``36.1234`` with floatformat:-3 gets converted to ``36.123``
+    * ``36`` with floatformat:-4 gets converted to ``36``
+
+Using ``floatformat`` with no argument is equivalent to using ``floatformat`` with 
+an argument of ``-1``.
+
 get_digit
 ~~~~~~~~~
 

tests/regressiontests/defaultfilters/tests.py

 '0.0'
 >>> floatformat(0.0)
 '0'
+>>> floatformat(7.7,3)
+'7.700'
+>>> floatformat(6.000000,3)
+'6.000'
+>>> floatformat(13.1031,-3)
+'13.103'
+>>> floatformat(11.1197, -2)
+'11.12'
+>>> floatformat(11.0000, -2)
+'11'
+>>> floatformat(11.000001, -2)
+'11.00'
+>>> floatformat(8.2798, 3)
+'8.280'
+>>> floatformat('foo')
+''
+>>> floatformat(13.1031, 'bar')
+'13.1031'
+>>> floatformat('foo', 'bar')
+''
 
 >>> addslashes('"double quotes" and \'single quotes\'')
 '\\"double quotes\\" and \\\'single quotes\\\''