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.