Skip to content

Commit

Permalink
Fixes #3176, #3004 -- Added an argument to the floatfilter to allow u…
Browse files Browse the repository at this point in the history
…sers to specify precision of floats, Thanks, Eric Floehr.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@4274 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
freakboy3742 committed Jan 3, 2007
1 parent 9e0c5d1 commit c3f8912
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 9 deletions.
1 change: 1 addition & 0 deletions AUTHORS
Expand Up @@ -78,6 +78,7 @@ answer newbie questions, and generally made Django that much better:
Clint Ecker
Enrico <rico.bl@gmail.com>
favo@exoweb.net
Eric Floehr <eric@intellovations.com>
gandalf@owca.info
Baishampayan Ghose
martin.glueck@gmail.com
Expand Down
32 changes: 25 additions & 7 deletions django/template/defaultfilters.py
Expand Up @@ -27,20 +27,38 @@ def fix_ampersands(value):
from django.utils.html import fix_ampersands
return fix_ampersands(value)

def floatformat(text):
"""
Displays a floating point number as 34.2 (with one decimal place) -- but
only if there's a point to be displayed
def floatformat(text, arg=-1):
"""
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
else:
if not m and d < 0:
return '%d' % int(f)
else:
formatstr = '%%.%df' % abs(d)
return formatstr % f

def linenumbers(value):
"Displays text with line numbers"
Expand Down
22 changes: 20 additions & 2 deletions docs/templates.txt
Expand Up @@ -924,13 +924,31 @@ Replaces ampersands with ``&amp;`` entities.
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
~~~~~~~~~

Expand Down
20 changes: 20 additions & 0 deletions tests/regressiontests/defaultfilters/tests.py
Expand Up @@ -11,6 +11,26 @@
'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\\\''
Expand Down

0 comments on commit c3f8912

Please sign in to comment.