C++20 引入了新的 format() 函数,该函数以字符串形式返回参数的格式化表示。format() 使用

python 风格的格式化字符串,具有简洁的语法、类型安全,以及出色的性能。

format() 函数接受一个格式字符串和一个模板形参包作为参数:

template< class ... Args>
string format(const string_view fmt, Args &&... args);

格式化字符串使用大括号 {} 作为格式化参数的占位符:

const int a{47};
// format("a is {}\n", a);
fmt::print("a is {}\n", a); // 输出为:
// a is 47
// 还使用大括号作为格式说明符,例如:
format("Hex: {:x} Octal: {:o} Decimal {:d} \n", a, a, a);
fmt::print("Hex: {:x} Octal: {:o} Decimal: {:d} \n", a,a,a);

本示例展示了如何将 fmt::print() 函数,用于一些常见的字符串格式化解决方案。

本章是使用 Windows 10/11 上的 Microsoft Visual C++ 编译器预览版开发的。撰写本文时,这是

唯一完全支持 C++20 库的编译器。最终的实现可能在某些细节上有所不同。

*How to do it

使用 format() 函数来考虑一些常见的格式化解决方案:

  • 先从一些变量开始格式化:
const int inta {47};
const char * human {"Tian_"};
const std::string_view alien {"vulcans_"};
const double df_pi {std::numbers::pi}; // pi 常数在 <numbers> 头文件和 std::numbers 命名空间中。
  • 可以使用 cout 显示变量:
cout << "inta is " << inta << '\n'
<< "hello, " << human << '\n'
<< "All " << alien << " are welcome here\n"
<< "π is " << df_pi << '\n';

得到这样的输出

a is 47
hello, Tian_
All vulcans_ are welcome here
π is 3.14159

现在,来看看 format() 如何对它们进行处理:

cout << format("Hello {}\n", human);

这是 format() 函数的最简单形式,格式字符串有一个占位符 {} 和一个对应的变量 human。输

出结果为:

Hello earthlings
  • format() 函数返回一个字符串,我们使用 cout<< 来显示该字符串。

    format() 库的建议包括一个 print() 函数,使用与 format() 相同的参数,这就可以打印格式化的

    字符串:

print("Hello {}\n", cstr);

但 print() 没有进入 C++20,但有望加入 C++23。

我们可以用一个简单的函数,使用 vformat() 提供相同的功能:

template<typename... Args>
constexpr void print(const std::string_view str_fmt,
Args && ... args) {
fputs(std::vformat(str_fmt,
std::make_format_args(args...)).c_str(),
stdout);
}

推荐一个更简单的,就是使用 vcpkg 引入 fmt 第三方库,可以保证不出问题

也正是博主所使用。

  • 这个简单的单行函数提供了一个有用的 print() 函数,可以用它来代替 cout << format() 组合
// using namespace fmt;
print("Hello {}\n", human);

格式字符串还提供了位置选项:

print("Hello {} we are {}\n", human, alien);
// 可以在格式字符串中使用位置选项来改变参数的顺序:
print("Hello {1} we are {0}\n", human, alien);

注意,参数保持不变。只有大括号中的位置值发生了变化。位置索引是从零开始的,就像 [] 操作符一样

这个特性对于国际化 (或本地化) 非常有用,因为不同的语言在句子中,可以使用不同的顺序。

  • 数字有很多格式化选项:
print("π is {}\n", df_pi);

// e.g: 指定精度的位数
print("π is {:.5}\n", df_pi); // 冒号字符“:”用于分隔位置索引和格式化参数:
print("inta is {1:}, π is {0:.5}\n", df_pi, inta); // 若想要一个值占用一定的空间,可以这样指定字符的数量:
print("inta is [{:10}]\n", inta);
// 输出: inta is [ 47] // 可以向左或向右对齐: 默认右对齐
print("inta is [{:<10}]\n", inta); // 左对齐
print("inta is [{:>10}]\n", inta); // 右对齐 // 默认情况下,用空格字符填充,但可以进行修改:
print("inta is [{:*<10}]\n", inta); // 使用 * 填充
print("inta is [{:0>10}]\n", inta); // 使用 0 填充 // 还可以将值居中:
print("inta is [{:^10}]\n", inta);
print("inta is [{:_^10}]\n", inta);
// 输出
// inta is [ 47 ]
// inta is [____47____] // 可以将整数格式化为十六进制、八进制或默认的十进制表示形式:
print("{:>8}: [{:04x}]\n", "Hex", inta);
print("{:>8}: [{:4o}]\n", "Octal", inta);
print("{:>8}: [{:4d}]\n", "Decimal", inta); /* 输出, 注意,这里使用右对齐来排列标签
Hex: [002f]
Octal: [ 57]
Decimal: [ 47]
*/ // 大写十六进制使用大写 X:
print("{:>8}: [{:04X}]\n", "Hex", inta);
/*
Hex: [002F]
*/

默认情况下,Windows 使用不常见的字符编码。最新版本可能默认为 UTF-16 或 UTF-8 BOM。旧版本可能默认为“代码页”1252,这是 ISO 8859-1 ASCII 标准的超集。Windows 系统默认为更常见的 UTF-8 (No BOM)。

默认情况下,Windows 不会显示标准 UTF-8 π 字符。要使 Windows 兼容 UTF-8 编码 (以及其他编码),请在测试时使用编译器开关/utf-8 并在命令行上发出命令 chcp 65001。现在,你也可以得到 π 并使用它。

【3rd_Party】format() 处理一些常见的格式化解决方案的更多相关文章

  1. 大数据技术之_08_Hive学习_05_Hive实战之谷粒影音(ETL+TopN)+常见错误及解决方案

    第10章 Hive实战之谷粒影音10.1 需求描述10.2 项目10.2.1 数据结构10.2.2 ETL原始数据10.3 准备工作10.3.1 创建表10.3.2 导入ETL后的数据到原始表10.3 ...

  2. asp.net MVC 常见安全问题及解决方案

    asp.net MVC 常见安全问题及解决方案 一.CSRF (Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session rid ...

  3. windows蓝屏代码大全及常见蓝屏解决方案

    对于以下的代码查询建议使用ctrl+F查询,而且很多蓝屏与黑屏的问题多是最近操作引起的,例如更新驱动,安装新的硬件.软件--把相关的配置调到最近的正常状况大多可以解决,确实不行时方可考虑重装系统,解决 ...

  4. 前端自定义format函数,做字符串格式化功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Oracle 字符集常见字符集及解决方案

    Oracle 字符集常见字符集及解决方案 优先级别:alter session>环境变量>注册表>参数文件 一.查看字符集: 1.查询服务端字符集: select userenv(' ...

  6. webapi发布常见错误及解决方案

    webapi发布常见错误及解决方案 错误一: 错误:404 (Not Found) 解决方案: 在  <system.webServer>节点中添加如下模块: <modules ru ...

  7. iis 部署webapi常见错误及解决方案

    iis 部署webapi常见错误及解决方案 错误一: 原因:asp.net web api部署在Windows服务器上后,按照WebAPI定义的路由访问,老是出现404,但定义一个静态文件从站点访问, ...

  8. Data Base oracle常见错误及解决方案

    Data Base oracle常见错误及解决方案 一.TNS协议适配器错误: 原因: 此问题的原因都是由于监听没有配置好. 解决: 1.打开oracle工具Net Manager,删除服务及监听,重 ...

  9. git常见错误及解决方案总结

    git常见错误及解决方案总结 使用git在本地创建一个项目的过程  $ makdir ~/hello-world                              //创建一个项目hello- ...

  10. [转]asp.net MVC 常见安全问题及解决方案

    本文转自:http://www.cnblogs.com/Jessy/p/3539564.html asp.net MVC 常见安全问题及解决方案 一.CSRF (Cross-site request ...

随机推荐

  1. rust程序设计(5)结构体相关练习题| 附带解答

    题目 基础结构体练习: 创建一个名为Person的结构体,包含name(字符串类型)和age(整数类型)两个字段. 写一个函数,接收一个Person实例作为参数,并打印出这个人的名字和年龄. 结构体方 ...

  2. Unity学习笔记--数据持久化之PlayerPrefs的使用

    数据持久化 PlayerPrefs相关 PlayerPrefs是Unity游戏引擎中的一个类,用于在游戏中存储和访问玩家的偏好设置和数据.它可以用来保存玩家的游戏进度.设置选项.最高分数等信息.Pla ...

  3. Sealos 云操作系统私有化部署教程

    Sealos 私有云已经正式发布了,它为企业用云提供了一种革命性的新方案.Sealos 的核心优势在于,它允许企业在自己的机房中一键构建一个功能与 Sealos 公有云完全相同的私有云.这意味着企业可 ...

  4. JAVAweek7

    本周学习[函数][数组] 什么是函数: 函数就是定义在类中的具有特定功能的一段独立小程序.函数也称为方法. 函数的格式: ·修饰符 返回值类型 函数名(参数类型 形式参数) { 执行语句: retur ...

  5. 【Javaweb】html frame标签的使用 | 导航栏右侧内容的实现

    问题的产生: 是我和同伴做了一个导航栏,但是我们不知道怎么实现右侧内容的切换 然后我们查了很多资料,但是有一些是垂直的,但是就如图可见,我们是水平的,那么怎么实现水平切换呢? 上网看到了frame标签 ...

  6. [python] 基于Tablib库处理表格数据

    Tablib是一个用于处理电子表格(如 Excel,CSV,JSON)的Python 库.它提供了一种简单而强大的方式来操作和处理数据.利用Tablib,我们可以轻松地读取.写入.过滤和转换各种类型的 ...

  7. 【已解决】【Tensorflow2.12.0版本以后合并CPU和GPU版】Tensorflow-gpu==2.12.0 安装失败解决办法

    直接上解决方式,需要知道原因的看后文. 直接安装 tensroflow,从 2022 年 12 月起 tensorflow-gpu 已经合并到 tensorflow 包中了 pip install t ...

  8. Springboot的Container Images,docker加springboot

    Spring Boot应用程序可以使用Dockerfiles容器化,或者使用Cloud Native Buildpacks来创建优化的docker兼容的容器映像,您可以在任何地方运行. 1. Effi ...

  9. springboot的缓存和redis缓存,入门级别教程

    一.springboot(如果没有配置)默认使用的是jvm缓存 1.Spring框架支持向应用程序透明地添加缓存.抽象的核心是将缓存应用于方法,从而根据缓存中可用的信息减少执行次数.缓存逻辑是透明地应 ...

  10. 云端开炉,线上训练,Bert-vits2-v2.2云端线上训练和推理实践(基于GoogleColab)

    假如我们一定要说深度学习入门会有一定的门槛,那么设备成本是一个无法避开的话题.深度学习模型通常需要大量的计算资源来进行训练和推理.较大规模的深度学习模型和复杂的数据集需要更高的计算能力才能进行有效的训 ...