A useful, but painful, one-liner to edit money amounts

Peter Otten __peter__ at web.de
Thu Aug 5 02:30:09 EDT 2010


John Nagle wrote:

> There's got to be a better way to do this:
> 
> 
> def editmoney(n) :
>      return((",".join(reduce(lambda lst, item : (lst + [item]) if
>          item else lst,
>          re.split(r'(\d\d\d)',str(n)[::-1]),[])))[::-1])
> 
> 
>  >>> editmoney(0)
> '0'
>  >>> editmoney(13535)
> '13,535'
>  >>> editmoney(-14535)
> '-14,535'
>  >>> editmoney(123456)
> '123,456'
>  >>> editmoney(1234567890)
> '1,234,567,890'
>  >>> editmoney(-1234)
> '-1,234'
> 
> The basic idea here is that we want to split the string of digits
> into groups of 3 digits, aligned at the right.  Because regular
> expressions are right to left, we have to reverse the string to
> do that, then reverse again at the end.  s[::-1} reverses an
> interable.
> 
> "split" with a capturing group introduces empty strings into the
> list.  Hence the "reduce" and lambda to get rid of them.
> 
> Any better ideas?
> 
> (Yes, I know there's a built-in feature for this scheduled for
> Python 2.7.)


>>> locale.setlocale(locale.LC_ALL, ("en_US", "UTF-8"))
'en_US.UTF8'
>>> print locale.currency(13535, grouping=True)
$13,535.00
>>> print locale.format("%d", 13535, grouping=True)
13,535

>>> locale.setlocale(locale.LC_ALL, "")
'de_DE.UTF-8'
>>> print locale.currency(13535, grouping=True)
13.535,00 €
>>> print locale.format("%d", 13535, grouping=True)
13.535

Peter




More information about the Python-list mailing list