Python: ¿Cómo formateo los números para un ancho fijo?

digamos

numbers = [ 0.7653, 10.2, 100.2325, 500.9874 ] 

Me gustaría dar salida a los números con un ancho fijo variando el número de lugares decimales para obtener una salida como esta:

 0.7653 10.200 100.23 500.98 

¿Hay una forma fácil de hacer esto? He estado probando con varias configuraciones %f y %d sin suerte.

Combinando dos llamadas str.format / format :

 numbers = [ 0.7653, 10.2, 100.2325, 500.9874 ] >>> for n in numbers: ... print('{:.6s}'.format('{:0.4f}'.format(n))) ... # OR format(format(n, '0.4f'), '.6s') ... 0.7653 10.200 100.23 500.98 

o % operadores :

 >>> for n in numbers: ... print('%.6s' % ('%.4f' % n)) ... 0.7653 10.200 100.23 500.98 

Alternativamente, puede utilizar rebanar :

 >>> for n in numbers: ... print(('%.4f' % n)[:6]) ... 0.7653 10.200 100.23 500.98 

Desafortunadamente, no hay una solución lista para usar para este problema. Además, la solución con corte de cadena no maneja adecuadamente el redondeo, sino también los desbordamientos.

Por lo tanto, parece que uno tiene que escribir una función propia como esta:

 def to_fixed_width(n, max_width, allow_overflow = True, do_round = True): if do_round: for i in range(max_width - 2, -1, -1): str0 = '{:.{}f}'.format(n, i) if len(str0) <= max_width: break else: str0 = '{:.42f}'.format(n) int_part_len = str0.index('.') if int_part_len <= max_width - 2: str0 = str0[:max_width] else: str0 = str0[:int_part_len] if (not allow_overflow) and (len(str0) > max_width): raise OverflowError("Impossible to represent in fixed-width non-scientific format") return str0 

El comportamiento resultante:

 >>> to_fixed_width(0.7653, 6) '0.7653' >>> to_fixed_width(10.2, 6) '10.200' >>> to_fixed_width(100.2325, 6) '100.23' >>> to_fixed_width(500.9874, 6) '500.99' >>> to_fixed_width(500.9874, 6, do_round = False) '500.98' 

Más ejemplos:

 >>> to_fixed_width(-0.3, 6) '-0.300' >>> to_fixed_width(0.000001, 6) '0.0000' >>> to_fixed_width(999.99, 6) '999.99' >>> to_fixed_width(999.999, 6) '1000.0' >>> to_fixed_width(1000.4499, 6) '1000.4' >>> to_fixed_width(1000.4499, 6, do_round = False) '1000.4' >>> to_fixed_width(12345.6, 6) '12346' >>> to_fixed_width(1234567, 6) '1234567' >>> to_fixed_width(1234567, 6, allow_overflow = False) Traceback (most recent call last): File "", line 1, in  File "", line 15, in to_fixed_width OverflowError: Impossible to represent in fixed-width non-scientific format >>> to_fixed_width(float('nan'), 6) 'nan'