541 votes

Chiffres fixes après la décimale avec les chaînes f

Existe-t-il un moyen simple avec les chaînes f de Python pour fixer le nombre de chiffres après la virgule ? (Spécifiquement f-strings, pas les autres options de formatage de chaîne comme .format ou %)

Par exemple, disons que je veux afficher 2 chiffres après la décimale.

Comment je fais ça ? Disons que

a = 10.1234

854voto

Robᵩ Points 50501

Incluez le spécificateur de type dans votre expression de format :

>>> a = 10.1234
>>> f'{a:.2f}'
'10.12'

58 votes

Aucun des exemples de formatage de f-string que j'ai trouvé, y compris le PEP, ne montre que vous pouvez utiliser le spécificateur de type. Je suppose que j'aurais dû le supposer, mais ce serait bien que la documentation le précise.

1 votes

Vous avez raison, la plupart des exemples ne comportent pas de spécificateur de format. Dans le PEP, l'exemple hexagonal en a un : f'input={value:#06x}' et les exemples de dates le font : {anniversary:%A, %B %d, %Y} y {date:%A} . Je pense que l'explication clé se trouve dans le Équivalence des codes section.

20 votes

Oh mec, c'est magnifique et simple. Pourquoi ça m'a pris plus de 45 secondes entières pour trouver cette réponse ? Améliore ton jeu, Google.

166voto

lmiguelvargasf Points 9693

Lorsqu'il s'agit de float vous pouvez utiliser spécificateurs de format :

f'{value:{width}.{precision}}'

où :

  • value est toute expression qui évalue un nombre
  • width spécifie le nombre de caractères utilisés au total pour l'affichage, mais si l'option value nécessite plus d'espace que la largeur spécifiée, l'espace supplémentaire est utilisé.
  • precision indique le nombre de caractères utilisés après le point décimal

Ce qui vous manque, c'est le spécificateur de type pour votre valeur décimale. Dans ce lien vous trouverez les types de présentation disponibles pour la virgule flottante et la décimale.

Voici quelques exemples, utilisant le f (Fixed point) type de présentation :

# notice that it adds spaces to reach the number of characters specified by width
In [1]: f'{1 + 3 * 1.5:10.3f}'
Out[1]: '     5.500'

# notice that it uses more characters than the ones specified in width
In [2]: f'{3000 + 3 ** (1 / 2):2.1f}' 
Out[2]: '3001.7'

In [3]: f'{1.2345 + 4 ** (1 / 2):9.6f}'
Out[3]: ' 3.234500'

# omitting width but providing precision will use the required characters to display the number with the the specified decimal places
In [4]: f'{1.2345 + 3 * 2:.3f}' 
Out[4]: '7.234'

# not specifying the format will display the number with as many digits as Python calculates
In [5]: f'{1.2345 + 3 * 0.5}'
Out[5]: '2.7344999999999997'

4 votes

N'est-ce pas le f disparu ? f'{value:{width}.{precision}f}' ?

1 votes

@Bouncner pas de .

0 votes

Où puis-je trouver quels types de rounds utilisent la méthode du spécificateur de format, merci. je sais qu'en le testant "round au plus proche avec des égalités s'éloignant de zéro", il est connu sous le nom de ROUND_HALF_UP. je ne trouve aucune information sur la stratégie de round qui utilise le spécificateur de format dans la doc.

55voto

Bouncner Points 118

Pour compléter la réponse de Rob : si vous souhaitez imprimer des nombres assez importants, l'utilisation de séparateurs de milliers peut être d'une grande aide (notez la virgule).

>>> f'{a*1000:,.2f}'
'10,123.40'

2 votes

Merci, bravo pour la virgule - qui peut lire de grands chiffres sans elles ?

47voto

Nicolas Gervais Points 21795

Ajouté à l'article de Rob responder vous pouvez utiliser des spécificateurs de format avec f cordes ( plus ici ).

  • Vous pouvez contrôler le nombre de décimales :

    pi = 3.141592653589793238462643383279

    print(f'The first 6 decimals of pi are {pi:.6f}.')

    The first 6 decimals of pi are 3.141593.

  • Vous pouvez convertir en pourcentage :

    grade = 29/45

    print(f'My grade rounded to 3 decimals is {grade:.3%}.')

    My grade rounded to 3 decimals is 64.444%.

  • Vous pouvez faire d'autres choses comme imprimer longueur constante :

    from random import randint for i in range(5): print(f'My money is {randint(0, 150):>3}$')

    My money is 126$ My money is 7$ My money is 136$ My money is 15$ My money is 88$

  • Ou même imprimer avec un virgule séparateur de milliers :

    print(f'I am worth {10000000000:,}$')

    I am worth 10,000,000,000$

4voto

Kent Pawar Points 600

Pensez-y :

>>> number1 = 10.1234
>>> f'{number1:.2f}'
'10.12'

Syntaxe :

"{" [field_name] ["!" conversion] [":" format_spec] "}"

Explication :

# Let's break it down...
#       [field_name]     => number1
#       ["!" conversion] => Not used
#       [format_spec]    => [.precision][type] 
#                        => .[2][f] => .2f  # where f means Fixed-point notation

Pour aller plus loin, les chaînes de format ont la syntaxe suivante. Comme vous pouvez le constater, il est possible de faire beaucoup plus.

Syntax: "{" [field_name] ["!" conversion] [":" format_spec] "}"

# let's understand what each field means...
    field_name        ::=  arg_name ("." attribute_name | "[" element_index "]")*
    arg_name          ::=  [identifier | digit+]
    attribute_name    ::=  identifier
    element_index     ::=  digit+ | index_string
    index_string      ::=  <any source character except "]"> +
    conversion        ::=  "r" | "s" | "a"
    format_spec       ::=  [[fill]align][sign][#][0][width][grouping_option][.precision][type]

            # Looking at the underlying fields under format_spec...
            fill            ::=  <any character>
            align           ::=  "<" | ">" | "=" | "^"
            sign            ::=  "+" | "-" | " "
            width           ::=  digit+
            grouping_option ::=  "_" | ","
            precision       ::=  digit+
            type            ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

Consultez le site https://docs.python.org/3/library/string.html#format-string-syntax

0 votes

Faites-moi savoir si je dois inclure d'autres exemples... Merci

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X