Pregunta

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

¿Cómo puedo hacer esto?

¿Fue útil?

Solución

Vea el módulo locale .

Esto formatea la moneda (y la 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'

Otros consejos

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 Babel ( y las utilidades de Django) de los chicos de Edgewall es increíble para el formato de moneda (y muchas otras tareas de i18n). Es agradable porque no sufre la necesidad de hacer todo a nivel mundial, como el módulo central de Python.

El ejemplo que dio el OP simplemente sería:

>>> 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 línea
  • Maneja múltiples variables
  • Maneja cantidades negativas 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, simplemente cambie $ por £

)

Salida:

<*>

Y para el póster original, obviamente, simplemente cambie $ por £

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

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

Independiente del sistema operativo

Solo quería compartir aquí.

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

Traceback (most recent call last):File "<stdin>", line 1, in <module> 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á hacer lo siguiente:

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

Oh, esa es una bestia interesante.

He pasado un tiempo considerable para hacerlo bien, hay tres problemas principales que difieren de un lugar a otro:  - símbolo de moneda y dirección  - mil separador  - punto decimal

He escrito mi propia implementación bastante extensa de esto, que es parte del marco de kiwi python, consulte 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 en Windows u otros Unixes.

Una vez que tenga eso instalado, puede 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 configuración regional seleccionada actualmente.

El punto principal que esta publicación tiene sobre la otra es que funcionará con versiones anteriores de python. locale.currency se introdujo en python 2.5.

Si fuera usted, usaría BABEL: http: //babel.pocoo .org / es / latest / index.html

from babel.numbers import format_decimal


format_decimal(188518982.18, locale='en_US')

#impresión de 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 suma de todos los números en mi programa particular. La variable puede ser cualquier cosa que decidas usar.

He venido a mirar lo mismo y encontré python-money todavía no lo usé realmente, pero quizás una combinación de los dos sería bueno

Un lambda para calcularlo dentro de una función, con la ayuda de @ 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 luego,

>>> converter(123132132.13, "<*>quot;)
'$123,132,132.13'

>>> converter(-123132132.13, "<*>quot;)
'-$123,132,132.13'

¡Código simple de Python!

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top