# insert thousands separators

Steven Taschuk staschuk at telusplanet.net
Fri Jun 13 20:38:42 CEST 2003

```Quoth Nick Vargish:
[...]
> def commafy(val):
>     """Returns a string version of val with commas every thousandth
>     place."""
>     return val < 0 and '-' + commafy(abs(val)) \
>            or val < 1000 and str(val) \
>            or commafy(val / 1000) + ',' + commafy(val % 1000)

A wee bug:

>>> commafy(1001)
'1,1'

I believe

return val < 0 and '-' + commafy(abs(val)) \
or val < 1000 and str(val) \
or commafy(val / 1000) + ',' + '%03d' % (val % 1000)

is correct.

Avoiding recursion seems reasonable, though:

def digits(value, base=10):
value = abs(value)
d = []
while True:
value, r = divmod(value, base)
d.append(r)
if not value:
break
d.reverse()
return d

def commafy(val):
d = digits(val, 1000)
d[0] = str(d[0])
if val < 0:
d[0] = '-' + d[0]
for i in range(1, len(d)):
d[i] = '%03d' % d[i]
return ','.join(d)

[...]
--
Steven Taschuk                                                 o- @
staschuk at telusplanet.net                                      7O   )
"  (

```