#CPP20. 【Level 2】全新的 C++ 之 format

【Level 2】全新的 C++ 之 format

format

  千呼万唤始出来!C++ 20 终于将 format 纳入标准库,但由于编译这一特性需要支持 --std=c++20 的编译器,因此 C++20 特性在实际项目开发中的普遍使用还有待时日。

基本用法

  将参数插入到格式字符串中,如果你掌握 Python 将会对这一操作非常熟悉

int year = 2024;
string message = format("The year is {}", year);
cout << message << endl; // 输出: The year is 2024

  可以同时传递多个参数,并指定插入的位置

string name = "Alice";
int age = 30;
cout << format("{} is {} years old.", name, age) << endl;
// 输出: Alice is 30 years old.

  甚至可以手动指定插入的位置,例如

string name1("Alice"), name2("Bob");
cout << std::format("hello, {1} and {0}!", name1, name2) << endl;
// hello, Bob and Alice!

指定格式

  可以指定数值的格式,例如整数的进制、浮点数的精度等。

  整数:二进制 b,八进制 o,十进制 d,十六进制 x/X

int num = 255;
double PI = 3.14159;

// 输出整数的十六进制格式
cout << format("Hex: {:x}", num);          // 输出: Hex: ff
cout << format("Hex: {:#x}", num) << endl; // 输出: Hex: 0xff

// 设置浮点数的精度
cout << format("Pi: {:.2f}", PI) << endl;  // 输出: Pi: 3.14

// 科学计数法输出浮点数
cout << format("Pi: {:.5e}", PI) << endl;  // 输出: Pi: 3.14159e+00

填充对齐

  控制格式化后的字符串的对齐方式,并使用字符填充指定的宽度

double num = 123.456;
cout << format("{:10.2f}", num) << endl; // 输出: "    123.46"
// 最小宽度为10,小数点后保留两位

string asterisks(7, '*');  // 初始化为 7 个 *
cout << format("{:10}-{:10}-", asterisks, asterisks) << endl;

cout << format("{:<10} is left aligned.", "left") << endl;   // 左对齐
cout << format("{:>10} is right aligned.", "right") << endl; // 右对齐
cout << format("{:^10} is centered.", "center") << endl;     // 居中
cout << format("{:*^10} is centered.", "center") << endl;    // 居中,并用 '*' 填充

  输出如下所示

    123.46
*******   -*******   -
left       is left aligned.
     right is right aligned.
  center   is centered.
**center** is centered.

Format

  你需要编写一个程序,处理两个任务:

  1. 格式化输出一系列整数和浮点数。
  2. 使用这些数值绘制一个字符图形,根据数值来控制图形的宽度或高度。

  要求:

  1. 所有整数以固定宽度 66 输出,并且右对齐。
  2. 所有浮点数保留两位小数,宽度为 88,右对齐。
  3. 输出的数值之间用一个空格分隔。
  4. 输出一个由字符 * 构成的 mmnn 列的矩形。

Input

  第一行是三个整数 mmnnkk。分别表示输出字符矩形的行数、列数,以及待格式化数的个数。

  第二行是 kk 个数(整数或浮点数)。

Output

  第一行是若干个格式化后的数值。

  第二行开始直到结束,输出一个由字符 * 构成的 mmnn 列的矩形。

Samples

4 6 3
123 4567 12.345
   123   4567   12.35
******
******
******
******
3 5 2
1.2345 678
   1.23    678
*****
*****
*****