std::format în C++

Formatare C++20

Construiește un std::string dintr-un șablon cu acolade {} și valori (C++20).

Sintaxă
#include <format>
std::string format(sablon, valori...);

Ce face std::format

std::format lucrează ca std::println, dar în loc să afișeze, returnează textul ca std::string. Îl folosești când textul trebuie salvat, trimis mai departe sau scris într-un fișier.

Specificațiile se scriu după două puncte: {:10} lățime, {:<10}, {:>10}, {:^10} aliniere, {:*^10} aliniere cu caracter de umplere, {:.2f} zecimale, {:05} completare cu zerouri, {:x}, {:o}, {:b} bazele 16, 8, 2, {:#x} cu prefixul 0x, {:+} semn, {:e} notație științifică.

Lățimea se măsoară în caractere afișate, nu în octeți, așa că textele cu diacritice se aliniază corect (spre deosebire de std::setw). Șablonul este verificat la compilare.

Parametri

Parametru Descriere
sablon Textul cu marcaje {}, cunoscut la compilare.
valori... Valorile care înlocuiesc marcajele, în ordine sau după indice ({0}, {1}).

Ce returnează

Un std::string nou cu textul formatat.

Exemple

Exemplul 1: Construirea unui mesaj

#include <format>
#include <print>
#include <string>

int main() {
    std::string nume = "Ana";
    int produse = 3;
    double total = 157.5;
    std::string mesaj = std::format("{}, ai {} produse în coș: {:.2f} lei.", nume, produse, total);
    std::println("{}", mesaj);
    std::println("Mesajul are {} octeți.", mesaj.size());
}

Rezultat

Ana, ai 3 produse în coș: 157.50 lei.
Mesajul are 39 octeți.

Exemplul 2: Numere în diverse forme

#include <format>
#include <print>

int main() {
    std::println("{}", std::format("zecimale:  {:.3f}", 3.14159));
    std::println("{}", std::format("zerouri:   {:05}", 42));
    std::println("{}", std::format("hexa:      {:x} {:#X}", 255, 255));
    std::println("{}", std::format("binar:     {:b}", 10));
    std::println("{}", std::format("octal:     {:o}", 8));
    std::println("{}", std::format("semn:      {:+} {:+}", 5, -5));
    std::println("{}", std::format("științific: {:e}", 1500000.0));
    std::println("{}", std::format("acolade:   {{}} {}", "ok"));
}

Rezultat

zecimale:  3.142
zerouri:   00042
hexa:      ff 0XFF
binar:     1010
octal:     10
semn:      +5 -5
științific: 1.500000e+06
acolade:   {} ok

Exemplul 3: Aliniere cu caracter de umplere și diacritice

Iași are 4 litere, dar 5 octeți; std::format numără literele, așa că aliniază corect.

#include <format>
#include <print>

int main() {
    std::println("[{:*^12}]", "Titlu");
    std::println("[{:<6}]", "Iași");
    std::println("[{:<6}]", "Cluj");
    std::println("[{:>6}]", "Brăila");
}

Rezultat

[***Titlu****]
[Iași  ]
[Cluj  ]
[Brăila]

Greșeli frecvente

  • Folosești un specificator nepotrivit cu tipul: std::format("{:d}", "text") nu compilează. Erorile de format apar la compilare, nu la rulare.
  • Încerci std::format(sablon_din_variabila, x). Șablonul trebuie să fie o constantă; pentru șabloane alese la rulare există std::vformat.
  • Construiești texte lungi cu multe std::format lipite cu +: fiecare creează un șir nou. std::format_to scrie direct la finalul unui șir existent.

Comenzi înrudite

  • std::println: Afișează text formatat cu acolade {} și trece pe rândul următor (C++23).
  • std::format_to: Scrie textul formatat direct într-un iterator de ieșire, de exemplu la finalul unui șir.
  • std::vformat: Formatează după un șablon cunoscut abia la rulare, de exemplu ales după limbă.
  • std::to_string: Transformă un număr în std::string, de exemplu 42 în „42”.
  • std::setw: Stabilește lățimea minimă a următoarei valori, cu aliniere și caracter de umplere.