Bỏ qua để đến nội dung

Đị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.

#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ị đúng n chữ số thập phân
  • std::setw(n): đặt độ rộng tối thiểu n ký tự cho giá trị tiếp theo
  • std::setfill(c): ký tự dùng để lấp đầy khoảng trống
#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.

  • <iomanip> (setprecision, setw, setfill) là cách định dạng truyền thống nhất với std::cout
  • printf (từ C) ngắn gọn nhưng không an toàn về kiểu dữ liệu
  • std::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ợ