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::formatlipite cu+: fiecare creează un șir nou.std::format_toscrie 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.