Định dạng xuất dữ liệu
C++ có nhiều cách để định dạng dữ liệu khi xuất ra màn hình, từ cổ điển đến hiện đại.
1. <iomanip>: định dạng với std::cout
Phần tiêu đề “1. <iomanip>: định dạng với std::cout”#include <iostream>#include <iomanip>
int main() { double pi = 3.14159265;
std::cout << std::fixed << std::setprecision(2) << pi << std::endl; // 3.14
std::cout << std::setw(10) << 42 << std::endl; // " 42" (căn phải, độ rộng 10) std::cout << std::setw(10) << std::left << 42 << std::endl; // "42 " (căn trái)
std::cout << std::setfill('0') << std::setw(5) << 42 << std::endl; // "00042"
return 0;}std::fixed+std::setprecision(n): hiển thị đúngnchữ số thập phânstd::setw(n): đặt độ rộng tối thiểunký tự cho giá trị tiếp theostd::setfill(c): ký tự dùng để lấp đầy khoảng trống
2. printf-style (kế thừa từ C)
Phần tiêu đề “2. printf-style (kế thừa từ C)”#include <cstdio>
int main() { double pi = 3.14159; printf("Pi = %.2f\n", pi); // Pi = 3.14 printf("So: %5d\n", 42); // So: 42 printf("Ten: %s, Tuoi: %d\n", "Alice", 30);
return 0;}printf nhanh và ngắn gọn nhưng không kiểm tra kiểu dữ liệu tại thời điểm biên dịch - dễ gây lỗi nếu dùng sai định dạng (%d cho double chẳng hạn).
3. std::format (C++20) - gần giống f-string nhất
Phần tiêu đề “3. std::format (C++20) - gần giống f-string nhất”#include <format>#include <iostream>
int main() { double pi = 3.14159; std::string s = std::format("Pi = {:.2f}", pi); std::cout << s << std::endl; // Pi = 3.14
std::cout << std::format("{} is {} years old", "Alice", 30) << std::endl;
return 0;}std::format an toàn về kiểu (type-safe) và có cú pháp ngắn gọn, dễ đọc, nhưng cần trình biên dịch hỗ trợ C++20.
Tổng kết
Phần tiêu đề “Tổng kết”<iomanip>(setprecision,setw,setfill) là cách định dạng truyền thống nhất vớistd::coutprintf(từ C) ngắn gọn nhưng không an toàn về kiểu dữ liệustd::format(C++20) là cách hiện đại, ngắn gọn và an toàn về kiểu - nên ưu tiên nếu trình biên dịch hỗ trợ