Come formattare un numero mobile a larghezza fissa in Python


322

Come posso formattare un numero mobile su una larghezza fissa con i seguenti requisiti:

  1. Zero iniziale se n <1
  2. Aggiungi zero decimale finale per riempire la larghezza fissa
  3. Tronca le cifre decimali oltre la larghezza fissa
  4. Allinea tutti i punti decimali

Per esempio:

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

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

L'output sarebbe simile

  23.2300
   0.1233
   1.0000
   4.2230
9887.2000

Risposte:


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

stampe

   23.2300
    0.1233
    1.0000
    4.2230
 9887.2000

L'identificatore di formato all'interno delle parentesi graffe segue la sintassi della stringa del formato Python . In particolare, in questo caso, è costituito dalle seguenti parti:

  • La stringa vuota prima dei due punti significa "porta il successivo argomento fornito a format()" - in questo caso xcome unico argomento.
  • La 10.4fparte dopo i due punti è la specifica del formato .
  • I fdenota notazione a virgola fissa.
  • La 10è la larghezza totale del campo da stampare, lefted imbottite da spazi.
  • Il 4è il numero di cifre dopo il punto decimale.

12
Quindi capisco che il 4f rappresenta la limitazione dei decimali a 4 (con zeri finali), ma cosa significa il 10? Ciò significa che questa formattazione non funzionerà con numeri interi maggiori di 9999999999 (dieci 9)? Solo curioso.
hobbes3,

55
10.4indica una larghezza di 10 caratteri e una precisione di 4 cifre decimali.
MRAB

13
@ hobbes3: 10è la larghezza minima del campo, ovvero la lunghezza minima della stringa stampata. Per impostazione predefinita, i numeri sono allineati a destra e riempiti di spazi: consultare la documentazione per ulteriori dettagli.
Sven Marnach,

9
Per Pythons prima della 2.7:("%0.4f" % x).rjust(10)
Steven Rumbalski il

22
@StevenRumbalski: O semplicemente "%10.4f" % x. In Python 2.6, puoi anche usare "{0:10.4f}".format(x).
Sven Marnach,

88

Sono passati alcuni anni da quando è stata data risposta, ma a partire da Python 3.6 ( PEP498 ) è possibile utilizzare il nuovo f-strings:

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

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

stampe:

  23.2300
   0.1233
   1.0000
   4.2230
9887.2000

2
Si noti che la larghezza include anche il carattere punto. Quindi, se si specifica 9 come larghezza, 1 verrà utilizzato per la stampa del punto, l'altro 8 per la stampa di cifre e spazi.
off99555

37

In python3 funziona come segue:

>>> v=10.4
>>> print('% 6.2f' % v)
  10.40
>>> print('% 12.1f' % v)
        10.4
>>> print('%012.1f' % v)
0000000010.4

Questo è cambiato negli ultimi 4 anni, ora la %formattazione è il metodo di formattazione più vecchio. Per diversi motivi è preferibile utilizzare str.formato . In precedenza, quando era solo , le persone avevano alcune ragioni, ma risolto quel buco. formattare documenti in mini-lingua , esempi di formato str. da documenti e esempi di letterali f-string in documentif-strings%str.formatf-strings
ninMonkey


6

Puoi anche lasciare il pad con gli zeri. Ad esempio, se vuoi numberavere una lunghezza di 9 caratteri, a sinistra imbottita con zeri usa:

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

Pertanto, se number = 4.656, l'output è:00004.656

Per il tuo esempio l'output sarà simile al seguente:

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

stampe:

00023.2300
00000.1233
00001.0000
00004.2230
09887.2000

Un esempio in cui ciò può essere utile è quando si desidera elencare correttamente i nomi dei file in ordine alfabetico. Ho notato in alcuni sistemi Linux, il numero è: 1,10,11, .. 2,20,21, ...

Pertanto, se si desidera imporre l'ordine numerico necessario nei nomi dei file, è necessario lasciare il pad con il numero appropriato di zeri.


2

In Python 3.

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

6.1fsignifica che dopo i punti 1 cifre indicano se si stampano 2 cifre dopo i puntini si deve solo %6.2fin modo tale che %6.3f3 cifre di stampa dopo il punto.


0

Avevo bisogno di qualcosa di simile per gli array. Questo mi ha aiutato

some_array_rounded=np.around(some_array, 5)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.