Number Format function

2006-02-08 Thread Edward Hartfield
I'm am relatively new to Python but use it daily.  Today, I went looking 
for a function, like PHP's number_function, that will take a number and 
return a string with number formatted with grouped thousands and the 
decimal portion rounded to a given number of places.  This is certainly 
needed when you want to take a floating-point value from a database and 
display it as currency, for instance.  I could not find what I was 
looking for so I wrote the following function.  I hope either (a) I've 
provided something useful or (b) someone can tell me what I *should* 
have done!  Thanks.


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(",")

   integer = "".join(formatted[::-1])
   return integer+decimal
begin:vcard
fn:Edward Hartfield
n:Hartfield;Edward
org:BungeeCraft Technologies
adr;dom:;;4824 W Medford Avenue;Milwaukee;Wisconsin;53216
email;internet:[EMAIL PROTECTED]
title:President
tel;work:414 839-2387
tel;fax:414 449-9105
note:Milwaukee-based BungeeCraft Technologies provides cost-effective technology solutions for small and mid-sized businesses. From aligning our clients' business and IT strategies to improving business processes and deploying and supporting solutions that accelerate business results, we are able and ready to provide YOU with comprehensive information technology solutions and services.
x-mozilla-html:FALSE
url:http://www.bungeecraft.com
version:2.1
end:vcard

-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Number Format function

2006-02-08 Thread Edward Hartfield
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)

[EMAIL PROTECTED] 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(100, 2), '1,000,000.00')
self.assertEqual(number_format(10, 2), '100,000.00')
self.assertEqual(number_format(100, 2), '100.00')
self.assertEqual(number_format(100.33, 2), '1,000,000.33')
self.assertEqual(number_format(100.333, 2), '1,000,000.33')
self.assertEqual(number_format(100.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)

  
begin:vcard
fn:Edward Hartfield
n:Hartfield;Edward
org:BungeeCraft Technologies
adr;dom:;;4824 W Medford Avenue;Milwaukee;Wisconsin;53216
email;internet:[EMAIL PROTECTED]
title:President
tel;work:414 839-2387
tel;fax:414 449-9105
note:Milwaukee-based BungeeCraft Technologies provides cost-effective technology solutions for small and mid-sized businesses. From aligning our clients' business and IT strategies to improving business processes and deploying and supporting solutions that accelerate business results, we are able and ready to provide YOU with comprehensive information technology solutions and services.
x-mozilla-html:FALSE
url:http://www.bungeecraft.com
version:2.1
end:vcard

-- 
http://mail.python.org/mailman/listinfo/python-list