使用string和string_view(三)——字符串格式化

发布时间:2026/11/12 18:23:51

使用string和string_view(三)——字符串格式化 目录1. std::format2. 格式说明符2.1 width2.2 [fill]align2.3 sign2.4 \#2.5 type2.6 precision2.7 0参考1. std::format直到C20之前字符串的格式化一般是通过printf()之类的C风格函数或是C的I/O流完成的1. C风格函数不推荐因为它们不是类型安全的并且无法扩展支持自定义类型因为字符串和参数是分开的所以可读性高且容易翻译成不同语言。例如printf(x has value %d and y has value %d.\n, x, y);2. C I/O流推荐(C20之前)因为类型安全且可扩展因为字符串和参数交织在一起所以可读性差且难以翻译成不同语言。例如std::cout x has value x and y has value y std::endl;C20引入了std::format()用来格式化字符串它定义在format中。它基本结合了C风格函数和C的I/O流的所有优点是一种类型安全且可扩展的机制。format()的第一个参数是待格式化的字符串后续参数是用于填充待格式化字符串中占位符的值。到目前为止使用format()时的占位符一般都是一对花括号{}。在这些花括号内可以是格式为[index][:specifier]的字符串。可以省略所有占位符中的index也可以为所有占位符指定从零开始的索引以指明应用于此占位符的第二个和后续参数。如果省略index则format()的第二个和后续参数传递的值将按给定顺序应用于所有占位符。specifier是一种格式化说明符用于更改值在输出中格式化的方式将在下一节详细说明。如果需要输出{or}字符则需要将其转义为{{or}}。以下对format()的调用省略了占位符中的显式索引auto s1 { std::format(Read {} bytes from {}\n, n, file1.txt) };可以按以下方式手动指定索引auto s1 { std::format(Read {0} bytes from {1}\n, n, file1.txt) };不允许混合使用手动和自动索引。下例使用了一个无效的字符串格式化auto s2 { std::format(Read {0} bytes from {}\n, n, file1.txt) };可以更改输出字符串中格式化值的顺序而不需要更改传递到format()的实参的实际顺序。如果要在软件中翻译字符串这是一个有用的功能。某些语言在句子中不同的顺序。例如前面的格式化字符串可以翻译成中文如下所示。在中文中句子中占位符的顺序是颠倒的但是由于格式化字符串中的占位符是有索引的format()函数的参数顺序保持不变(L前缀的用法后面介绍)。auto s3 { std::format(L从{1}中读取{0}个字节\n, n, Lfile1.txt) }:2. 格式说明符格式说明符用于控制值在输出中的格式前缀为冒号。格式说明符的一般形式如下所示(L与地区特定格式有关但是在我国好像没啥变化)。[[fill]align][sign][#][0][width][.precision][L][type]方括号里的所有说明符都是可选的。2.1 widthwidth指定待格式化的值所占字段的最小宽度例如5。width也可以是另一组花括号称为动态宽度。如果在花括号中指定了索引例如{3}则动态宽度的width取自给定索引对应的format()的实参。如果未指定索引例如{}则width取自format()的实参列表中的下一个参数。示例如下inti{42};std::coutstd::format(|{:5}|\n,i);// | 42|std::coutstd::format(|{:{}}|\n,i,8);// | 42|2.2 [fill]align[fill]align说明使用哪个字符作为填充字符然后是值在其字段中的对齐方式。对齐符号含义左对齐(非整数和非浮点数的默认对齐方式)右对齐(整数和浮点数的默认对齐方式)^居中对齐在待格式化字符前插入⌊ 宽度 − 待格式化字符串长度 2 ⌋ \lfloor\frac{宽度-待格式化字符串长度}{2}\rfloor⌊2宽度−待格式化字符串长度​⌋个字符在待格式化字符串之后插入⌈ 宽度 − 待格式化字符串长度 2 ⌉ \lceil\frac{宽度-待格式化字符串长度}{2}\rceil⌈2宽度−待格式化字符串长度​⌉fill字符会被插入输出中以确保输出中的字段达到说明符的[width]指定的最小宽度。如果未指定[width]则[fill]align无效。示例如下inti{42};std::coutstd::format(|{:7}|\n,i);// | 42|std::coutstd::format(|{:7}|\n,i);// |42 |std::coutstd::format(|{:_7}|\n,i);// |_____42|std::coutstd::format(|{:_^7}|\n,i);// |__42___|2.3 signsign符号含义-只显示负数的符号(默认方式)显示正数和负数的符号空格对负数使用负号对于正数使用空格示例如下inti{42};std::coutstd::format(|{:5}|\n,i);// |42 |std::coutstd::format(|{:5}|\n,i);// |42 |std::coutstd::format(|{: 5}|\n,i);// | 42 |std::coutstd::format(|{: 5}|\n,-i);// |-42 |2.4 ##启用所谓的备用格式规则。如果为整型启用并且还指定了十六进制、二进制或八进制数字格式则备用格式会在格式化数字前面插入0x、0X、0b、0B或0。如果为浮点类型启用则备用格式将始终输出十进制分隔符即使后面没有数字。具体示例见下面。2.5 typetype指定了给定值要被格式化的类型类型符号含义整型bBd(整型默认类型)oxX二进制二进制当指定#时使用0B而不是0b十进制八进制小写字母abcde的十六进制大写字母ABCDE的十六进制当指定#时使用0X而不是0x浮点型e,Ef,Fg(浮点型默认类型),Ga,A以小写e或大写E表示指数的科学表示法按照给定精度或6(如果未指定精度)格式化固定表示法按照给定精度或6(如果未指定精度)格式化以小写e或大写E表示指数的通用表示法按照给定精度或6(如果未指定精度)格式化带有小写字母(a)或大写字母(A)的十六进制表示法布尔型s(布尔型默认类型)bBcdoxX以文本形式输出true或false以整型输出1或0字符型c(字符型默认类型)bBdoxX输出字符副本整数表示字符串s(字符串默认类型)输出字符串副本指针p(指针默认类型)0x为前缀的十六进制表示法整型示例如下inti{42};std::coutstd::format(|{:10d}|\n,i);// | 42|std::coutstd::format(|{:10b}|\n,i);// | 101010|std::coutstd::format(|{:#10b}|\n,i);// | 0b101010|std::coutstd::format(|{:10o}|\n,i);// | 52|std::coutstd::format(|{:#10o}|\n,i);// | 052|std::coutstd::format(|{:10x}|\n,i);// | 2a|std::coutstd::format(|{:#10X}|\n,i);// | 0X2A|布尔型示例如下boolt{true};boolf{false};std::coutstd::format(|{:10s}|\n,t);// | true|std::coutstd::format(|{:10b}|\n,f);// | 0|std::coutstd::format(|{:10B}|\n,t);// | 1|std::coutstd::format(|{:10d}|\n,f);// | 0|std::coutstd::format(|{:10o}|\n,t);// | 1|std::coutstd::format(|{:10x}|\n,f);// | 0|std::coutstd::format(|{:10X}|\n,t);// | 1|字符型示例如下chara{c};std::coutstd::format(|{:10c}|\n,a);// |c |std::coutstd::format(|{:#10b}|\n,a);// | 0b1100011|std::coutstd::format(|{:#10B}|\n,a);// | 0B1100011|std::coutstd::format(|{:10d}|\n,a);// | 99|std::coutstd::format(|{:#10o}|\n,a);// | 0143|std::coutstd::format(|{:#10x}|\n,a);// | 0x63|std::coutstd::format(|{:#10X}|\n,a);// | 0X63|字符串的示例如下std::string s{ProCpp};std::coutstd::format(|{:_^10}|\n,s);// |__ProCpp__|2.6 precisionprecision只能用于浮点和字符串类型。它的格式为一个点后跟浮点类型要输出的小数点位数(e、f、a)或整个浮点类型包含的有效数字个数(g)或字符串要输出的字符数。就像width一样也可以是另一组花括号在这种情况下它被称为动态精度。precision取自format()的实参列表中的下一个实参或具有给定索引的实参。浮点型的示例如下doubled{3.1415/2.3};std::string s{Hello, World!};std::coutstd::format(|{:12.2g}|\n,d);// | 1.4|std::coutstd::format(|{:12.3e}|\n,d);// | 1.366e00|std::coutstd::format(|{:12.2a}|\n,d);// | 1.5ep0|intwidth{12};intprecision{3};std::coutstd::format(|{2:{0}.{1}f}|\n,width,precision,d);// | 1.366|2.7 00表示对于数值将0插入格式化结果中以达到[width]指定的最小宽度。这些0插在数值前面但在符号以及任何0x、0X、0b或0B前缀之后。如果指定了align则将忽略本选项。示例如下inti{42};doublef{3.1415/2.3};std::coutstd::format(|{:06d}|\n,i);// |000042|std::coutstd::format(|{:06d}|\n,i);// |00042|std::coutstd::format(|{:06X}|\n,i);// |00002A|std::coutstd::format(|{:#06X}|\n,i);// |0X002A|std::coutstd::format(|{:#06o}|\n,i);// |000052|std::coutstd::format(|{:012.3f}|\n,f);// |00000001.366|参考[比] 马克·格雷戈勒著 程序喵大人 惠惠 墨梵 译 C20高级编程(第五版)
延伸阅读

更多相关文章

2026/11/10 2:10:54

基于3D物流图与改进奇里科夫图的图像混合加密方案

1. 项目概述在数字图像安全传输领域,图像加密技术一直是研究热点。这个项目提出了一种结合3D物流图和改进型奇里科夫图的混合加密方案,通过Matlab实现了一套完整的图像加密解密系统。我在实际测试中发现,这种混合算法在安全性、抗攻击性和执行…

2026/11/10 2:12:49

SqlSugar ORM框架核心特性与高级应用实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/12 4:29:47

电力系统经济调度中的遗传算法优化实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/12 22:50:43

呼和浩特电工证报考:证书过期了不知道怎么复审延期?良心建议来了

呼和浩特电工证报考:证书过期了不知道怎么复审延期?良心建议来了 证书过期了不知道怎么复审延期?别慌,这波良心建议能帮你搞定!别再让一张过期的电工证,毁掉你的工作机会和职业前途。呼和浩特电工证报考,已经不是个新鲜事,但很多人还是踩坑,特别是对…

2026/11/12 22:50:43

施工防水证是特种工吗网上查询不到怎么报?别被中介骗了

施工防水证是特种工吗网上查询不到怎么报?别被中介骗了 你是不是也这样,手里拿着施工防水证,但不知道是不是特种作业证,网上查了一圈,不是没结果就是一堆广告?其实,很多人都有这个困惑:**施工防水证是特种工吗?**答案并不复杂,但得从头讲起。…

2026/11/12 22:50:43

通化电工证在哪里办官方回应实操考试心里没底怕挂科

通化电工证在哪里办官方回应实操考试心里没底怕挂科 你是不是也像我一样,第一次报考电工证,心里直打鼓,生怕实操考试挂科,连个证都拿不到?别急,我这就有个真实案例,讲讲通化电工证在哪里办、考试怎么准备、证书怎么查,还有遇到问题怎么办。…

2026/11/12 22:50:43

电工证怎么考最好考官方报名入口怎么找

电工证怎么考最好考官方报名入口怎么找 怕考不过白交培训费?别急,先看这条真实案例,教你避开报名、考试、复审的那些坑! 案例背景:一个施工老板的电工证焦虑…

2026/11/12 22:50:43

高压电工证考试科目二多久拿证?实操考试心里没底怕挂科

高压电工证考试科目二多久拿证?实操考试心里没底怕挂科 实操考试心里没底怕挂科?别慌!高压电工证考试科目二到底考什么?多久能拿到证?这是很多准备考高压电工证的小伙伴最关心的问题。今天我们就来帮你理清楚高压电工证考试科目二的考试内容和流程,让你…

2026/11/12 20:35:13

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/12 0:04:01

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘 工地太忙根本没时间复习考试?你不是一个人。作为一名在南阳卧龙区干了七八年市政公用工程的电工,我深知这个问题的现实性。电工证不仅是工作的“入场券”,更是职业发展的“通行证”,但备考过程…

2026/11/12 0:04:01

双流电工证考别怕挂科!郑州报考避坑指南全攻略

双流电工证考别怕挂科!郑州报考避坑指南全攻略 实操考试心里没底怕挂科?双流电工证考在郑州报名,很多人因为不了解流程、准备不充分,白白浪费时间和金钱。作为三门峡应届工程类毕业生,我也曾经历过这样的焦虑。今天就从零开始,手把手教你如何避开郑州报…

2026/11/12 0:04:01

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少 之前考的证在外省能不能转过来?这个问题确实让不少准备换城市工作的朋友犯了难,尤其像电工证这种实操性很强的证书,很多人担心跨省后证书能不能继续用。其实,只要符合相关流程,是可以顺利转…

2026/11/12 22:10:13

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/12 9:51:42

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑