fmt库使用教程
介绍
fmt是一个现代化、易用的c++格式化库,现已进入c++20标准。
源码地址:https://github.com/fmtlib/fmt.git
测试版本:12.0.0
占位符
占位符格式 | 功能 | 示例 | 输出 |
{} | 自动位置,默认格式 | fmt::format("{}+{}", 1, 2) | 1+2 |
{n} | 手动位置,默认格式 | fmt::format("{1}+{0}", 1, 2) | 2+1 |
{:spec} | 自动位置,自定义格式 | fmt::format("{:.2f}", 3.14159) | 3.14 |
{n:spec} | 手动位置,自定义格式 | fmt::format("{1:.2f}+{0}", 1, 3.14159) | 3.14+1 |
格式说明符
一般形式为:{:[填充字符][对齐方式][符号][#][0][宽度][.精度][类型]}
字符串的形式为:[填充字符][对齐方式][宽度][类型];
整数的常用形式为:[符号][#][0][宽度][类型],通过[0]的实现右对齐并向左填充0;
整数的另一种形式为:[填充字符][对齐方式][符号][#][宽度][类型],允许指定对齐方式和填充字符;
浮点数的形式为:[符号][#][0][宽度][.精度][类型]仅针对数值类型,包括整数、浮点数;
浮点数的另一种形式为:[填充字符][对齐方式][符号][#][宽度][.精度][类型];
布尔的形式为:与字符串相同。
通用格式
格式:[填充字符 ][对齐方式][宽度]
#include <fmt/format.h>int main() {std::string text = "hello";int number = 42;// 字符串对齐(默认左对齐)fmt::print("|{:<10}|\n", text); // |hello | - 左对齐fmt::print("|{:^10}|\n", text); // | hello | - 居中对齐 fmt::print("|{:>10}|\n", text); // | hello| - 右对齐// 数字对齐(默认右对齐)fmt::print("|{:<10}|\n", number); // |42 | - 左对齐fmt::print("|{:^10}|\n", number); // | 42 | - 居中对齐fmt::print("|{:>10}|\n", number); // | 42| - 右对齐// 自定义填充字符fmt::print("|{:*<10}|\n", text); // |hello*****| - 左对齐,*填充fmt::print("|{:=^10}|\n", number); // |====42====| - 居中对齐,=填充fmt::print("|{:.>10}|\n", text); // |.....hello| - 右对齐,.填充return 0;
}
[符号]
显示数值正负号。
#include <fmt/format.h>int main() {int positive = 42;int negative = -42;// 默认:只显示负号fmt::print("{}\n", positive); // 42fmt::print("{}\n", negative); // -42// + : 总是显示符号fmt::print("{:+}\n", positive); // +42fmt::print("{:+}\n", negative); // -42// 空格 : 正数前加空格,负数显示负号fmt::print("{: }\n", positive); // " 42"(前面有个空格)fmt::print("{: }\n", negative); // -42
}
[#]
显示数值类型的前缀。
#include <fmt/format.h>int main() {int num = 255;// 十六进制fmt::print("{:x}\n", num); // fffmt::print("{:#x}\n", num); // 0xff// 二进制fmt::print("{:b}\n", num); // 11111111fmt::print("{:#b}\n", num); // 0b11111111
}
[0]
零填充(只在未指定对齐方式时有效)
#include <fmt/format.h>int main() {int num = 42;// 普通宽度填充(空格)fmt::print("|{:6}|\n", num); // | 42|// 零填充fmt::print("|{:06}|\n", num); // |000042|// 负数的情况fmt::print("|{:06}|\n", -num); // |-00042|// 与其他格式组合fmt::print("|{:#08x}|\n", 255); // |0x0000ff|// 重要:零填充与对齐冲突时,零填充被忽略fmt::print("|{:<06}|\n", num); // |42 | - 使用空格填充return 0;
}
[.精度]
浮点数精度控制。
#include <fmt/format.h>int main() {double pi = 3.1415926535;// 浮点数精度fmt::print("{:.2f}\n", pi); // 3.14fmt::print("{:.5f}\n", pi); // 3.14159fmt::print("{:.0f}\n", pi); // 3
}
[类型]
整数。
#include <fmt/format.h>int main() {int num = 255;fmt::print("{:d}\n", num); // 255 - 十进制fmt::print("{:x}\n", num); // ff - 十六进制fmt::print("{:b}\n", num); // 11111111 - 二进制fmt::print("{:c}\n", 65); // A - 字符
}
浮点数。
#include <fmt/format.h>int main() {double val = 123.456789;fmt::print("{:f}\n", val); // 123.456789 - 固定小数
}
字符串。
#include <fmt/format.h>int main() {std::string text = "hello";fmt::print("{:s}", text); // hello - 字符串(默认)
}
布尔。
#include <fmt/format.h>int main() {bool flag = true;fmt::print("{}\n", flag); // true - 默认为文本格式fmt::print("{:<10s}\n", flag); // true - 左对齐,宽度10fmt::print("{:d}\n", flag); // 1 - 数字形式
}
特殊用法
直接输出到stdout
fmt::print("Hello, world!\n");