Cómo formatear un número flotante a ancho fijo en Python

322

¿Cómo formateo un número flotante a un ancho fijo con los siguientes requisitos:

  1. Cero inicial si n <1
  2. Agregue cero (s) decimales finales para llenar el ancho fijo
  3. Truncar dígitos decimales más allá del ancho fijo
  4. Alinear todos los puntos decimales

Por ejemplo:

% formatter something like '{:06}'
numbers = [23.23, 0.123334987, 1, 4.223, 9887.2]

for number in numbers:
    print formatter.format(number)

La salida sería como

  23.2300
   0.1233
   1.0000
   4.2230
9887.2000
hobbes3
fuente

Respuestas:

500
for x in numbers:
    print "{:10.4f}".format(x)

huellas dactilares

   23.2300
    0.1233
    1.0000
    4.2230
 9887.2000

El especificador de formato dentro de las llaves sigue la sintaxis de la cadena de formato Python . Específicamente, en este caso, consta de las siguientes partes:

  • La cadena vacía antes de los dos puntos significa "tomar el siguiente argumento proporcionado a format()", en este caso xel único argumento.
  • La 10.4fparte después de los dos puntos es la especificación de formato .
  • Los fdenota de punto fijo notación.
  • El 10es el ancho total del campo que se está imprimiendo, rellenado por espacios.
  • El 4es el número de dígitos después del punto decimal.
Sven Marnach
fuente
12
Entonces entiendo que el 4f representa limitar los decimales a 4 (con ceros finales), pero ¿qué significa el 10? ¿Eso significa que este formato no funcionará con enteros mayores que 9999999999 (diez 9)? Sólo curioso.
hobbes3
55
10.4significa un ancho de 10 caracteres y una precisión de 4 decimales.
MRAB
13
@ hobbes3: 10es el ancho mínimo del campo, es decir, la longitud mínima de la cadena impresa. Por defecto, los números están alineados a la derecha y rellenados con espacios; consulte la documentación para obtener más detalles.
Sven Marnach
99
Para Pythons anteriores a 2.7:("%0.4f" % x).rjust(10)
Steven Rumbalski
22
@StevenRumbalski: O simplemente "%10.4f" % x. En Python 2.6, también puedes usar "{0:10.4f}".format(x).
Sven Marnach
88

Han pasado algunos años desde que esto fue respondido, pero a partir de Python 3.6 ( PEP498 ) podría usar el nuevo f-strings:

numbers = [23.23, 0.123334987, 1, 4.223, 9887.2]

for number in numbers:
    print(f'{number:9.4f}')

Huellas dactilares:

  23.2300
   0.1233
   1.0000
   4.2230
9887.2000
artomason
fuente
2
Tenga en cuenta que el ancho también incluye el carácter de punto. Entonces, si especifica que 9 sea ancho, 1 se usará para imprimir el punto, los otros 8 serán para imprimir dígitos y espacios.
off99555
37

En python3 funciona lo siguiente:

>>> v=10.4
>>> print('% 6.2f' % v)
  10.40
>>> print('% 12.1f' % v)
        10.4
>>> print('%012.1f' % v)
0000000010.4
Scott Roberts
fuente
Esto ha cambiado en los últimos 4 años, ahora el %formateo es el método más antiguo de formateo. Por varias razones se usa str.formato f-stringsse prefiere sobre %. Anteriormente, cuando era solo str.format, la gente tenía algunas razones pero f-stringsarreglaban ese agujero. formatee documentos en mini-lenguaje , ejemplos de formato de str de documentos y ejemplos de literales de f-string en documentos
ninMonkey
10

Consulte la sintaxis de cadena de formato Python 3.x :

IDLE 3.5.1   
numbers = ['23.23', '.1233', '1', '4.223', '9887.2']

for x in numbers:  
    print('{0: >#016.4f}'. format(float(x)))  

     23.2300
      0.1233
      1.0000
      4.2230
   9887.2000
readyleader
fuente
6

También puedes dejar el pad con ceros. Por ejemplo, si desea numbertener 9 caracteres de longitud, a la izquierda rellenos con ceros use:

print('{:09.3f}'.format(number))

Por lo tanto, si number = 4.656, la salida es:00004.656

Para su ejemplo, la salida se verá así:

numbers  = [23.2300, 0.1233, 1.0000, 4.2230, 9887.2000]
for x in numbers: 
    print('{:010.4f}'.format(x))

huellas dactilares:

00023.2300
00000.1233
00001.0000
00004.2230
09887.2000

Un ejemplo en el que esto puede ser útil es cuando desea enumerar correctamente los nombres de los archivos en orden alfabético. Noté que en algunos sistemas Linux, el número es: 1,10,11, .. 2,20,21, ...

Por lo tanto, si desea aplicar el orden numérico necesario en los nombres de archivo, debe dejar el pad izquierdo con el número apropiado de ceros.

elcymon
fuente
2

En Python 3.

GPA = 2.5
print(" %6.1f " % GPA)

6.1fmedios después de los puntos 1 dígitos muestran si imprime 2 dígitos después de que los puntos sólo se debe %6.2ftal que %6.3f3 dígitos después del punto de imprimir.

Usman Zia
fuente
0

Necesitaba algo similar para las matrices. Eso me ayudo

some_array_rounded=np.around(some_array, 5)
Anton
fuente