Home » Sciences et technologies » La bibliothèque de formatage en C++20 : La chaîne de format

La bibliothèque de formatage en C++20 : La chaîne de format

by Nouvelles
La bibliothèque de formatage en C++20 : La chaîne de format

2024-01-29 13:10:00

Dans mon dernier article, j’ai présenté « Développement logiciel : la bibliothèque de formatage en C++20 ». Aujourd’hui, je vais approfondir la spécification de format de la chaîne de format.

Publicité


Rainer Grimm travaille depuis de nombreuses années en tant qu’architecte logiciel, responsable d’équipe et de formation. Il aime écrire des articles sur les langages de programmation C++, Python et Haskell, mais aime également intervenir fréquemment lors de conférences spécialisées. Sur son blog Modern C++, il parle intensément de sa passion C++.



Je voudrais commencer par un bref résumé de la chaîne de format.

  • Syntaxe: std::format(FormatString, Args)

La chaîne de format Chaîne de format consiste

  • Caractères ordinaires (sauf { et })
  • Séquences d’échappement {{ et }}par { et } Est remis, remplacé
  • Champs de remplacement

Un champ de remplacement a le format { }.

Vous pouvez utiliser un ID d’argument et deux points dans le champ de remplacement, suivis d’une spécification de format. Les deux composants sont facultatifs.

Grâce à l’ID d’argument, certains arguments peuvent être réorganisés ou abordés. L’ID d’argument peut être utilisé pour spécifier l’index des arguments dans Args. Les ID commencent par 0. Si aucun ID d’argument n’est spécifié, les champs sont renseignés dans le même ordre que celui dans lequel les arguments sont spécifiés. Soit tous les champs de remplacement doivent utiliser un ID d’argument, soit aucun.

// formatArgumentID.cpp

#include 
#include 
#include 
 
int main() {
    
    std::cout << 'n';

    std::cout << std::format("{} {}: {}!n", 
                             "Hello", "World", 2020); // (1)

    std::cout << std::format("{1} {0}: {2}!n",
                             "World", "Hello", 2020); // (2)

    std::cout << std::format("{0} {0} {1}: {2}!n",
                             "Hello", "World", 2020); // (3)

    std::cout << std::format("{0}: {2}!n", 
                             "Hello", "World", 2020); // (4)
    
    std::cout << 'n';
   
}

(1) affiche les arguments dans l'ordre spécifié. En revanche, dans (2) les premier et deuxième arguments sont réorganisés, dans (3) le premier argument est affiché deux fois et dans (4) le deuxième argument est ignoré.

Par souci d'exhaustivité, voici le résultat du programme :



L'application de l'argument id avec la spécification de format rend le formatage du texte très puissant en C++20.

Je ne présenterai pas la spécification formelle du format pour les types de données, les types de chaînes et les types chrono. Pour les types de données et std::string finden sich tous les détails ici : spécification de format standard. Par conséquent, les détails des types de chrono peuvent être trouvés ici : spécification du format du chrono.

Au lieu de cela, je présente une description pragmatique de la chaîne de format pour les types de données, les types de chaîne et les types chrono.

fill_align(opt) sign(opt) #(opt) 0(opt) width(opt) precision(opt) L(opt) type(opt) 

Toutes les pièces sont facultatives (opt). Dans les sections suivantes, je discuterai plus en détail des fonctionnalités de cette spécification de format.

Le caractère de remplissage est facultatif (n'importe quel caractère sauf { ou }) et est suivi d'une instruction d'alignement. Pour utiliser le caractère de remplissage, vous devez spécifier l'alignement.

  • Caractère de remplissage : Par défaut, le caractère espace est utilisé
  • Orientation:
    • <: gauche (par défaut pour les valeurs qui ne sont pas des nombres)
    • >: droite (par défaut pour les nombres)
    • ^: centré

// formatFillAlign.cpp

#include 
#include 
 
int main() {

    std::cout << 'n';
    
    int num = 2020;

    std::cout << std::format("{:6}", num) << 'n'; 
    std::cout << std::format("{:6}", 'x') << 'n';   
    std::cout << std::format("{:*<6}", 'x') << 'n';
    std::cout << std::format("{:*>6}", 'x') << 'n';
    std::cout << std::format("{:*^6}", 'x') << 'n';
    std::cout << std::format("{:6d}", num) << 'n';
    std::cout << std::format("{:6}", true) << 'n';

    std::cout << 'n';
   
}

L'alignement par défaut dépend des types de données utilisés. Contrairement à l'opérateur iostream, les valeurs booléennes sont par défaut comme true ou false montré.



Signe, # et 0 ne sont valides que lorsqu’un type entier ou à virgule flottante est utilisé.

Le signe peut avoir les valeurs suivantes :

  • +: Le signe est utilisé pour les nombres zéro et positifs.
  • -: Le signe n'est utilisé que pour les nombres négatifs (par défaut).
  • Espace : un espace de début est utilisé pour les nombres non négatifs et un signe moins est utilisé pour les nombres négatifs.

// formatSign.cpp

#include 
#include 
 
int main() {

    std::cout << 'n';

    std::cout << std::format("{0:},{0:+},{0:-},{0: }", 0) << 'n';
    std::cout << std::format("{0:},{0:+},{0:-},{0: }", -0) << 'n';
    std::cout << std::format("{0:},{0:+},{0:-},{0: }", 1) << 'n';
    std::cout << std::format("{0:},{0:+},{0:-},{0: }", -1) << 'n';

    std::cout << 'n';
   
}

Le # provoque la forme alternative :

  • Pour les types de données entiers, le préfixe 0b, 0 ou 0x utilisé pour les types représentés binaires, octaux ou hexadécimaux.
  • Un point décimal est toujours utilisé pour les types de données comportant des nombres à virgule flottante.
  • 0: Remplissage avec des zéros non significatifs

// formatAlternate.cpp

#include 
#include 
 
int main() {

    std::cout << 'n';

    std::cout << std::format("{:#015}", 0x78) << 'n';
    std::cout << std::format("{:#015b}", 0x78) << 'n';
    std::cout << std::format("{:#015x}", 0x78) << 'n';

    std::cout << 'n';

    std::cout << std::format("{:g}", 120.0) << 'n';
    std::cout << std::format("{:#g}", 120.0) << 'n';

    std::cout << 'n';
   
}



Le spécificateur de format peut être utilisé pour spécifier la précision, la largeur et le type de données de la valeur. J'écrirai à ce sujet dans mon prochain article.


(moi)

Vers la page d'accueil



#bibliothèque #formatage #C20 #chaîne #format
1706743999

You may also like

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.