Sure, but it is very poor code.
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
import locale
from types import *
locale.setlocale(locale.LC_ALL, '')
localenv = locale.localeconv()
def commify(n):
if n is None: return None
if type(n) is StringType:
sepdec = localenv['mon_decimal_point']
else:
#if n is python float number we use everytime the dot
sepdec = '.'
n = str(n)
if sepdec in n:
dollars, cents = n.split(sepdec)
else:
dollars, cents = n, None
r = []
for i, c in enumerate(reversed(str(dollars))):
if i and (not (i % 3)):
r.insert(0, localenv['mon_thousands_sep'])
r.insert(0, c)
out = ''.join(r)
if cents:
out += localenv['mon_decimal_point'] + cents
return out
def subst(str, pattern, fill):
out = []
ctrlchars = 'X' + localenv['mon_thousands_sep']
for c in pattern:
if str != '' and str != []:
if c == "X":
out.append(str[0])
str = str[1:]
else:
out.append(c)
else:
if c in ctrlchars:
out.append(fill)
else:
out.append(c)
return out
def numify(string):
ctrlchars = '0123456' + localenv['mon_decimal_point']
return ''.join([c for c in str(string) if c in ctrlchars])
def moneyfy(num, pattern):
#if n is a float we must stringify and normalize the dec separator
if type(num) is not StringType:
num = str(num)
num = num.replace('.',localenv['mon_decimal_point'])
#we need integer part and decimal part od number and pattern
try:
(strint, strdec) = num.split(localenv['mon_decimal_point'])
except:
strint = num
strdec = ''
try:
(patint, patdec) = pattern.split(localenv
['mon_decimal_point'])
except:
patint = pattern
patdec = ''
#inizialize
buff0 = buff1 = sep = ''
#decimal part must accomodate to pattern with correct zerofill
#and patterm can have more lenght than number
if len(strdec) == len(patdec):
out = subst(strdec, patdec,'0')
buff1 = ''.join(out)
elif len(strdec) > len(patdec):
strdec = strdec[:len(patdec)]
if strdec != '':
out = subst(strdec, patdec,'0')
buff1 = ''.join(out)
elif len(strdec) < len(patdec):
#decimal part of money is less than pattern
pattern = ['X'] * len(patdec)
out = subst(strdec, pattern,'0')
buff1 = ''.join(out)
#integer part is composed by end...
s = list(strint)
s.reverse()
p = list(patint)
p.reverse()
out = subst(s, p,' ')
#....and is reversed for output
out.reverse()
buff0 = ''.join(out)
#if pattern has decimals localize the decimal separator
if patdec != '':
sep = localenv['mon_decimal_point']
return buff0 + sep + buff1
if __name__ == '__main__':
print commify(1)
print commify(123)
print commify(1234)
print commify(1234567890)
#....decimal.......
print commify('123,0')
print commify('1234,5')
print commify('1234,56789')
#....but....
print commify(123.0)
print commify(1234.5)
print commify(1234.56789)
#....money as string....
print moneyfy('123456,1234', "€ XXX.XXX.XXX,XX")
print moneyfy('123456,12', "€ XXX.XXX.XXX,XX")
print moneyfy('123456,5', "€ XXX.XXX.XXX,XX")
#....money as float.....
print moneyfy(123456.1234, "€ XXX.XXX.XXX,XX")
print moneyfy(123456.12, "€ XXX.XXX.XXX,XX")
print moneyfy(123456.5, "€ XXX.XXX.XXX,XX")
#....return number....
print numify("$ 123.456,50")
On 29 Gen, 18:53, Aaron Swartz <[email protected]> wrote:
> can you share?
>
> On Jan 29, 2009 12:47 PM, "leone" <[email protected]> wrote:
>
> Thanks for your suggest. I used local module.
> I have built a moneyfy function too.
> Best regards
>
> On 29 Gen, 08:16, Aaron Swartz <[email protected]> wrote:
>
> > won't the locale module tell you these? we should use that instead of
>
> having > our own config > > ...
>
> > On Jan 29, 2009 2:13 AM, "leone" <[email protected]> wrote: > > Some
>
> european countries use deci...
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"web.py" 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/webpy?hl=en
-~----------~----~----~----~------~----~------~--~---