Formato de moneda en Python

Estoy buscando dar formato a un número como 188518982.18 a £ 188,518,982.18 usando Python.

¿Cómo puedo hacer esto?

Ver el módulo de configuración regional .

Esto hace el formato de moneda (y fecha).

 >>> import locale >>> locale.setlocale( locale.LC_ALL, '' ) 'English_United States.1252' >>> locale.currency( 188518982.18 ) '$188518982.18' >>> locale.currency( 188518982.18, grouping=True ) '$188,518,982.18' 

Nuevo en 2.7

 >>> '{:20,.2f}'.format(18446744073709551616.0) '18,446,744,073,709,551,616.00' 

http://docs.python.org/dev/whatsnew/2.7.html#pep-0378

No estoy seguro de por qué no se menciona más en línea (o en este hilo), pero el paquete de Babel (y las utilidades de Django) de los chicos de Edgewall es increíble para el formato de moneda (y muchas otras tareas i18n). Está bien porque no tiene la necesidad de hacer todo el mundo como el módulo de configuración regional de Python.

El ejemplo que dio el OP sería simplemente:

 >>> import babel.numbers >>> import decimal >>> babel.numbers.format_currency( decimal.Decimal( "188518982.18" ), "GBP" ) £188,518,982.18 

Esta es una publicación antigua, pero acabo de implementar la siguiente solución que:

  • No requiere módulos externos.
  • No requiere crear una nueva función.
  • Se puede hacer en linea
  • Maneja múltiples variables
  • Maneja montos negativos en dólares.

Código:

 num1 = 4153.53 num2 = -23159.398598 print 'This: ${:0,.0f} and this: ${:0,.2f}'.format(num1, num2).replace('$-','-$') 

Salida:

 This: $4,154 and this: -$23,159.40 

Y para el póster original, obviamente, solo cambia $ por £

Mi configuración de configuración regional parecía incompleta, así que tuve que mirar más allá de esta respuesta SO y encontré:

http://docs.python.org/library/decimal.html#recipes

Independiente del sistema operativo

Sólo quería compartir aquí.

Si está utilizando OSX y aún no ha configurado la configuración del módulo de configuración regional, esta primera respuesta no funcionará, recibirá el siguiente error:

 Traceback (most recent call last):File "", line 1, in  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/locale.py", line 221, in currency raise ValueError("Currency formatting is not possible using "ValueError: Currency formatting is not possible using the 'C' locale. 

Para remediar esto deberás hacer lo siguiente:

 locale.setlocale(locale.LC_ALL, 'en_US') 

Oh, eso es una bestia interesante.

He invertido bastante tiempo en hacerlo bien, hay tres problemas principales que difieren de una localidad a otra: – símbolo y dirección de la moneda – separador de miles – punto decimal

He escrito mi propia implementación bastante extensa de esto, que forma parte del marco de kiwi python, echa un vistazo a la fuente LGPL: ed aquí:

http://svn.async.com.br/cgi-bin/viewvc.cgi/kiwi/trunk/kiwi/currency.py?view=markup

El código es ligeramente específico de Linux / Glibc, pero no debería ser demasiado difícil de adoptar para Windows u otros Unixes.

Una vez que tengas eso instalado puedes hacer lo siguiente:

 >>> from kiwi.datatypes import currency >>> v = currency('10.5').format() 

Que luego te dará:

 '$10.50' 

o

 '10,50 kr' 

Dependiendo de la localidad seleccionada actualmente.

El punto principal que tiene este post sobre el otro es que funcionará con versiones anteriores de python. locale.currency se introdujo en Python 2.5.

# imprimiendo la variable ‘Total:’ en un formato similar a este ‘9,348.237’

 print ('Total:', '{:7,.3f}'.format(zum1)) 

donde ‘{: 7, .3f}’ es el número de espacios para formatear el número en este caso es un millón con 3 puntos decimales. Luego agrega el ‘.format (zum1). El zum1 es la variable que tiene el número grande para la sum de todos los números en mi progtwig particular. Variable puede ser cualquier cosa que decidas usar.

Si yo fuera tú, usaría BABEL: http://babel.pocoo.org/en/latest/index.html

 from babel.numbers import format_decimal format_decimal(188518982.18, locale='en_US') 

Vine a ver lo mismo y descubrí que el dinero de python no lo usaba todavía, pero tal vez una combinación de ambos sería buena.

Un lambda para calcularlo dentro de una función, con la ayuda de la respuesta de @Nate

 converter = lambda amount, currency: "%s%s%s" %( "-" if amount < 0 else "", currency, ('{:%d,.2f}'%(len(str(amount))+3)).format(abs(amount)).lstrip()) 

y entonces,

 >>> converter(123132132.13, "$") '$123,132,132.13' >>> converter(-123132132.13, "$") '-$123,132,132.13' 

Código de python simple!

 def format_us_currency(value): value=str(value) if value.count(',')==0: b,n,v='',1,value value=value[:value.rfind('.')] for i in value[::-1]: b=','+i+b if n==3 else i+b n=1 if n==3 else n+1 b=b[1:] if b[0]==',' else b value=b+v[v.rfind('.'):] return '$'+(value.rstrip('0').rstrip('.') if '.' in value else value)