2012-10-10 25 views
6

La pregunta es para Python 2.6, eso es lo que tenemos en producción.Cómo formatear un número con coma y dígitos de precisión especificados en Python

Tengo este requisito para formatear un número (como 1234567.0987 o 1234567.0) con una coma, y ​​el número especificado de dígitos después de los puntos decimales. Entonces, si la precisión es tres, 1234567.0987 puede parecerse a 1,234,567.099.

He intentado usar la configuración regional, como se sugiere en las respuestas a muchas preguntas, el problema es que da como resultado dos dígitos después del decimal, lo que no es aceptable para mi requisito.

He intentado buscar en otros lugares, pero no encontró ninguna solución, y finalmente creó un método por mi propia:

def format_float(value, precision = 4): 
    formatString = "%0." + str(precision) + "f"  
    str_val = formatString % value 
    first, second = str_val.split('.') 
    first = int(first) 
    group = [] 
    while True: 
     result, mod = first/1000, first % 1000 
     group.append(str(mod)) 
     if result == 0: 
      break 
     first = result 
    group.reverse() 
    return ','.join(group) + '.' + second 

Traté de correr algunas pruebas para probar el método y funciona bien :

# default 4 digits precision 
assert format_float(1234567890.0876543) == '1,234,567,890.0877' 
assert format_float(1.2) == '1.2000' 
assert format_float(1234) == '1,234.0000' 
assert format_float(0) == '0.0000' 

# 3 digits precision 
assert format_float(1234567890.0876543, precision=3) == '1,234,567,890.088' 
assert format_float(0, precision=3) == '0.000' 

Siendo nuevo en Python, mi pregunta es si esta es una solución aceptable. Como este formato tiene que hacerse muchas veces en un apretado ciclo, agradecería que alguien pueda señalar una mejor solución.

Gracias y Saludos a todos

+2

Pruébalo con '1000000'. –

+0

Mark, gracias. Ese es un buen error, necesito arreglar esto. – cspider

+1

No tiene que usar el módulo 'locale'. Ver mi respuesta a la pregunta [_¿Cuál es la forma más fácil de agregar comas a un número entero en Python? _] (Http://stackoverflow.com/q/3909457/355230). – martineau

Respuesta

18

No te creo parecían lo suficientemente profundo en el módulo de configuración regional. locale.format() es lo que desea, pero asegúrese de establecer primero una configuración regional o no obtendrá ninguna agrupación.

>>> locale.setlocale(locale.LC_ALL, '') 
'en_US.UTF-8' 
>>> locale.format("%.4f", 12345.678912, grouping=True) 
'12,345.6789' 
+0

locale aware FTW ... –

+1

+1 nunca se enteró del módulo 'locale'. –

+0

@cdhowie, gracias, esto funciona para mí, incluso con. Pasé por alto la opción de formato(). – cspider

12

para Python 2.7 y 3.x se puede hacer algo como:

>>> num=1234567890.0876543 
>>> "{0:,f}".format(num) 
'1,234,567,890.087654' 
>>> "{0:,.2f}".format(num) 
'1,234,567,890.08' 
>>> "{0:,f}".format(1234) 
'1,234.000000' 
+0

Ah, sígueme. Por cierto, esto también funciona en 2.7.3 – kreativitea

+0

@kreativitea. Lo comprobaba en línea. Lo intenté solo en Python 2.6 donde no funcionó. –

+0

Gracias, sin embargo, edité mi pregunta original, que esta pregunta para Python 2.6. – cspider

Cuestiones relacionadas