DMarlon Studio

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.

C++ · Dar formato a la salida en DMarlon Studio: el código del ejemplo y su salida en la terminal

`<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::left y std::right alinean, 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::oct y std::dec cambian 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.