Number Format function

Edward Hartfield ehartfield at bungeecraft.com
Wed Feb 8 15:33:17 EST 2006


Thanks.  I noticed the bugs later.  But after talking with my boss, he 
suggested something more elegant (again *untested*, yet):

import locale

def number_format(num, places=0)
    """Format a number according to locality and given places"""
    locale.setlocale(locale.LC_ALL, locale.getdefaultlocale()[0])
    return locale.format("%.*f", (places, num), 1)

wittempj at hotmail.com wrote:
> Your code has a little bug, I highly recommend to add a test to your
> code, for an idea see below - I fixed your code as well.
>
> #!/usr/bin/env python
> import math
>
> def number_format(num, places=0):
>     """Format a number with grouped thousands and given decimal
> places"""
>     #is_negative = (num < 0)
>     #if is_negative:
>     #    num = -num
>
>     places = max(0,places)
>     tmp = "%.*f" % (places, num)
>     point = tmp.find(".")
>     integer = (point == -1) and tmp or tmp[:point]
>     decimal = (point != -1) and tmp[point:] or ""
>
>     count = commas = 0
>     formatted = []
>     for i in range(len(integer) - 1, 0, -1):
>         count += 1
>         formatted.append(integer[i])
>         if count % 3 == 0:
>             formatted.append(",")
>     formatted.append(integer[0]) # this misses in your part
>     integer = "".join(formatted[::-1])
>     return integer+decimal
>
>
> #
> # add something like this: it helps to prevent you break your code
> #
> import unittest
>
> class test_number_format(unittest.TestCase):
>     def test(self):
>         self.assertEqual(number_format(1000000, 2), '1,000,000.00')
>         self.assertEqual(number_format(100000, 2), '100,000.00')
>         self.assertEqual(number_format(100, 2), '100.00')
>         self.assertEqual(number_format(1000000.33, 2), '1,000,000.33')
>         self.assertEqual(number_format(1000000.333, 2), '1,000,000.33')
>         self.assertEqual(number_format(1000000.3, 2), '1,000,000.30')
>         self.assertEqual(number_format(123456, 2), '123,456.00')
>         self.assertEqual(number_format(12345, 2), '12,345.00')
>         self.assertEqual(number_format(123, 2), '123.00')
>         self.assertEqual(number_format(123456.33, 2), '123,456.33')
>         self.assertEqual(number_format(12345.333, 2), '12,345.33')
>         self.assertEqual(number_format(123.3, 2), '123.30')
>
> suite = unittest.makeSuite(test_number_format)
> unittest.TextTestRunner(verbosity=2).run(suite)
>
>   
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ehartfield.vcf
Type: text/x-vcard
Size: 724 bytes
Desc: not available
URL: <http://mail.python.org/pipermail/python-list/attachments/20060208/604b4b46/attachment.vcf>


More information about the Python-list mailing list