Lección 17 · 17 de 20
Dar formato a la salida · C++
Alinee columnas y controle los decimales en C++ con setw, left, right, setfill, fixed y setprecision de <iomanip>: la carta de una cafetería.

`<iomanip>` trae los manipuladores, que se envían a std::cout con << para cambiar cómo se escribe lo que viene después. Con ellos se monta la carta de una cafetería en columnas.
`std::setw(14)` reserva 14 caracteres solo para el siguiente valor; por eso se repite delante de cada columna. `std::left` y `std::right` alinean el texto dentro de ese ancho, y se mantienen hasta que se cambien.
`std::setfill('-')` cambia el carácter de relleno: con setw(22) y un texto vacío, dibuja una raya de 22 guiones. Después se vuelve al espacio con std::setfill(' '). El mismo truco con '0' escribe el número de pedido 00042.
`std::fixed` junto con `std::setprecision(2)` escribe siempre dos decimales: 3 sale como 3.00, lo ideal para precios. Sin fixed (std::defaultfloat), setprecision(3) cuenta cifras significativas, y π queda en 3.14.
`std::hex` y `std::oct` escriben los enteros en hexadecimal y en octal; std::dec vuelve al decimal. Los pares de menu se recorren con enlaces estructurados, como en la lección anterior.
Código · main.cpp
#include <iomanip>#include <iostream>#include <string>#include <utility>#include <vector>int main() { std::vector<std::pair<std::string, double>> menu = { {"Coffee", 1.5}, {"Croissant", 2.25}, {"Orange juice", 3}, {"Toast", 1.8}}; // setw sets the width of the NEXT value; left and right align it. std::cout << std::left << std::setw(14) << "Item" << std::right << std::setw(8) << "Price" << '\n'; // setfill changes the character that fills the gap. std::cout << std::setfill('-') << std::setw(22) << "" << std::setfill(' ') << '\n'; // fixed + setprecision(2): always two decimals, until changed. std::cout << std::fixed << std::setprecision(2); double total = 0; for (const auto& [name, price] : menu) { std::cout << std::left << std::setw(14) << name << std::right << std::setw(8) << price << '\n'; total += price; } std::cout << std::left << std::setw(14) << "TOTAL" << std::right << std::setw(8) << total << '\n'; // Leading zeros for an order number. std::cout << "Order #" << std::setfill('0') << std::setw(5) << 42 << std::setfill(' ') << '\n'; // Without fixed, setprecision counts significant digits. std::cout << std::defaultfloat << std::setprecision(3) << "Pi is about " << 3.14159 << '\n'; // Integers in other bases. std::cout << "255 in hex: " << std::hex << 255 << ", in octal: " << std::oct << 255 << std::dec << '\n'; return 0;}Salida · c++ -std=c++17 main.cpp -o main && ./main
Item Price ---------------------- Coffee 1.50 Croissant 2.25 Orange juice 3.00 Toast 1.80 TOTAL 8.55 Order #00042 Pi is about 3.14 255 in hex: ff, in octal: 377
Para recordar
std::setw(n)fija el ancho del siguiente valor.std::leftystd::rightalinean, y duran hasta que se cambian.std::setfill(c)cambia el carácter de relleno.std::fixed << std::setprecision(2): siempre dos decimales.std::hex,std::octystd::deccambian la base.
Ejercicio
Añada a la carta una columna Qty con las unidades pedidas de cada producto y otra con el importe (unidades por precio), todas alineadas a la derecha, y el total al final.