Comment formater un nombre flottant à largeur fixe en Python

322

Comment formater un nombre flottant à une largeur fixe avec les exigences suivantes:

  1. Zéro en tête si n <1
  2. Ajouter des zéros décimaux de fin pour remplir une largeur fixe
  3. Tronquer les chiffres décimaux au-delà de la largeur fixe
  4. Aligner tous les points décimaux

Par exemple:

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

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

La sortie serait comme

  23.2300
   0.1233
   1.0000
   4.2230
9887.2000
hobbes3
la source

Réponses:

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

impressions

   23.2300
    0.1233
    1.0000
    4.2230
 9887.2000

Le spécificateur de format à l'intérieur des accolades suit la syntaxe de chaîne de format Python . Plus précisément, dans ce cas, il se compose des parties suivantes:

  • La chaîne vide avant les deux-points signifie "prendre l'argument fourni suivant format()" - dans ce cas x, le seul argument.
  • La 10.4fpartie après les deux points est la spécification de format .
  • La fdénote la notation à virgule fixe.
  • La 10est la largeur totale du champ en cours d' impression, restantes de -rembourré par des espaces.
  • Le 4est le nombre de chiffres après la virgule décimale.
Sven Marnach
la source
12
Je comprends donc que le 4f représente la limitation des décimales à 4 (avec des zéros de fin), mais que signifie le 10? Cela signifie-t-il que cette mise en forme ne fonctionnera pas avec des entiers supérieurs à 9999999999 (dix 9)? Juste curieux.
hobbes3
55
10.4signifie une largeur de 10 caractères et une précision de 4 décimales.
MRAB
13
@ hobbes3: 10est la largeur minimale du champ, c'est-à-dire la longueur minimale de la chaîne imprimée. Les nombres sont par défaut alignés à droite et remplis d'espaces - voir la documentation pour plus de détails.
Sven Marnach
9
Pour les Pythons avant 2.7:("%0.4f" % x).rjust(10)
Steven Rumbalski
22
@StevenRumbalski: Ou tout simplement "%10.4f" % x. Dans Python 2.6, vous pouvez également utiliser "{0:10.4f}".format(x).
Sven Marnach
88

Cela fait quelques années que cela n'a pas été répondu, mais à partir de Python 3.6 ( PEP498 ), vous pouvez utiliser le nouveau f-strings:

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

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

Tirages:

  23.2300
   0.1233
   1.0000
   4.2230
9887.2000
artomason
la source
2
Notez que la largeur inclut également le caractère point. Donc, si vous spécifiez 9 comme largeur, 1 sera utilisé pour l'impression du point, les 8 autres pour l'impression des chiffres et des espaces.
off99555
37

En python3, les travaux suivants:

>>> v=10.4
>>> print('% 6.2f' % v)
  10.40
>>> print('% 12.1f' % v)
        10.4
>>> print('%012.1f' % v)
0000000010.4
Scott Roberts
la source
Cela a changé au cours des 4 dernières années, le %formatage est désormais la méthode de formatage la plus ancienne. Pour plusieurs raisons, l'utilisation de str.formatou f-stringsest préférable à %. Auparavant, alors que ce n'était que le cas str.format, les gens avaient des raisons mais ont f-stringscorrigé ce trou. formater des documents en mini-langage , des exemples str.format à partir de documents et des exemples de littéraux de chaîne f dans des documents
ninMonkey
10

Voir la syntaxe de chaîne au format 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
la source
6

Vous pouvez également laisser un pad avec des zéros. Par exemple, si vous voulez numberavoir une longueur de 9 caractères, complétez avec des zéros à gauche, utilisez:

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

Ainsi, si number = 4.656la sortie est:00004.656

Pour votre exemple, la sortie ressemblera à ceci:

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

impressions:

00023.2300
00000.1233
00001.0000
00004.2230
09887.2000

Un exemple où cela peut être utile est lorsque vous souhaitez répertorier correctement les noms de fichiers par ordre alphabétique. J'ai remarqué dans certains systèmes Linux, le nombre est: 1,10,11, .. 2,20,21, ...

Ainsi, si vous souhaitez appliquer l'ordre numérique nécessaire dans les noms de fichiers, vous devez laisser le pavé avec le nombre approprié de zéros.

elcymon
la source
2

En Python 3.

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

6.1fsignifie après que les points 1 chiffres s'affichent si vous imprimez 2 chiffres après les points, vous ne devez imprimer %6.2fque %6.3f3 chiffres après le point.

Usman Zia
la source
0

J'avais besoin de quelque chose de similaire pour les tableaux. Cela m'a aidé

some_array_rounded=np.around(some_array, 5)
Anton
la source