!!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!!

作者:mohist

fmt

正文

本文将介绍 fmt::format()和fmt::print()之类的格式化函数使用

A、格式化字符串有占位符,用大括号 {}表示占位,格式化字符串放在{}中间。没有放在{}之间的字符串被视为字符串输出。 如果需要输出的字符串中有大括号{},可以额外增加一个大括号来实现。例如:{ { 和 } }

B、占位符语法如下:

replacement_field	:: = "{"[arg_id][":" format_spec] "}"
arg_id :: = integer | identifier
integer :: = digit +
digit :: = "0"..."9"
identifier :: = id_start id_continue*
id_start :: = "a"..."z" | "A"..."Z" | "_"
id_continue :: = id_start | digit

1、替换字段可用以 arg_id 开头,该参数指定要格式化其值并将其插入输出的参数,而不是替换字段。可选的arg_id放在format_spec的后面,其后是冒号':'。这些指定替换值的非默认格式。

2、如果格式字符串中的数字arg_ids依次为0、1、2,...,则可以全部省略(不只是某些数字),数字0、1、2,...将按此顺序自动插入。

3、命名参数可以通过其名称或索引来引用。例如:

"First, thou shalt count to {0}"	// 替换第一个参数
"Bring me a {}" // 隐式引用第一个参数
"From {} to {}" // 这行代码和 "From {0} to {1}"功效相同

4、format_spec 字段包含有关如何显示值的规范,包括字段宽度,对齐方式,填充,小数精度等详细信息。每种值类型都可以定义自己的“formatting mini - language”或对format_spec的解释。

5、大多数内置类型都支持通用的formatting mini - language,这将在下一节中进行介绍。

6、format_spec字段还可以在其中的某些位置包含嵌套的替换字段。这些嵌套的替换字段只能包含一个参数id。格式规格是不允许的。这将允许动态指定值的格式。

C、Mini - Language的格式规范

1、在格式字符串中包含的替换字段中使用“格式规范”来定义如何显示单个值。每种格式表类型可以定义如何解释格式规范。

2、 尽管某些格式化选项仅受数字类型支持,但大多数内置类型都为格式规范实现了以下选项。

3、标准格式说明符的一般形式为:

format_spec	:: = [[fill]align][sign]["#"]["0"][width]["." precision][type]
fill :: = <a character other than '{' or '}'>
align :: = "<" | ">" | "^"
sign :: = "+" | "-" | " "
width :: = integer | "{"[arg_id] "}"
precision :: = integer | "{"[arg_id] "}"
type :: = int_type | "a" | "A" | "c" | "e" | "E" | "f" | "F" | "g" | "G" | "L" | "p" | "s"
int_type :: = "b" | "B" | "d" | "o" | "x" | "X"

4、填充字符可以是'{'或'}'以外的任何Unicode代码点。填充字符的存在由其后的字符表示,该字符必须是对齐选项之一。如果format_spec的第二个字符不是有效的对齐选项,则假定填充字符和对齐选项都不存在。

5、各种对齐选项的含义如下:

Option Meaning

'<' 强制字段在可用空间内左对齐((大多数对象的默认设置).

'>' 强制字段在可用空间内右对齐(这是数字的默认设置).

'^' 强制字段在可用空间内居中.

6、请注意,除非定义了最小字段宽度,否则字段宽度将始终与填充它的数据大小相同。因此在这种情况下,对齐选项没有任何意义。

7、符号选项仅对数字类型有效,并且可以是以下之一:

Option Meaning

'+' 表示正负数均应使用符号,例如: + 5, - 2。

'-' 表示符号只能用于负数(负数默认设置显示)。

space 表示应在正数上使用前导空格,在负数上使用减号。

8、“#”选项使“替代形式”用于转换。替代形式对于不同类型的定义不同。此选项仅对整数和浮点类型有效。对于整数,使用二进制,八进制或十六进制输出时,此选项将前缀“ 0b”(“ 0B”),“ 0”或“ 0x”(“ 0X”)添加到输出值。前缀是小写还是大写取决于类型说明符的大小写,例如,前缀“ 0x”用于类型“ x”,“ 0X”用于“ X”。对于浮点数,替代格式会导致转换结果始终包含小数点字符,即使后面没有数字也是如此。通常,只有在数字后面跟随小数点字符,这些转换的结果才会出现。另外,对于“ g”和“ G”转换,不会从结果中删除部零。

9、width是定义最小字段宽度的十进制整数。如果未指定,则字段宽度将由内容确定。

10、在宽度字段前面加上零('0'),字符可启用数字类型的符号识别0填充.它强制将填充内容放置在符号或基数(如果有)之后但在数字之前。这用于以“ + 000000120”形式打印字段。此选项仅对数字类型有效,并且对无穷大和NaN的格式无效。

11、precision是一个十进制数字,表示以'f'和'F'格式设置的浮点值在小数点后应显示多少位数,用'g'或'G'格式化的浮点值小数点前后。对于非数字类型,该字段指示最大字段大小,换句话说,字段内容中将使用多少个字符。整数,字符,布尔值和指针值不允许使用精度。

12、type字段决定了应如何显示数据。

13、可用的字符串表示类型为:

Type   Meaning

's' 字符串格式。字符串的默认类型,可以省略

none 与's'相同

14、可用的字符显示类型为:

Type Meaning

'c' 字符格式。字符的默认类型,可以省略。

none 与'c'相同

15、可用的整数表示类型为:

Type Meaning
'b' 二进制格式。输出以2为进制的数字。在此类型中使用'#'选项,会将前缀“ 0b”添加到输出值中。value.
'B' 二进制格式。输出以2为进制的数字。对此类型使用'#'选项,可在输出值中添加前缀“ 0B”。
'd' 十进制整数。输出以10为进制的数字。
'0' 八进制格式。输出以8为进制的数字。
'x' 十六进制格式。输出以16为进制的数字,对9以上的数字使用小写字母。将'#'选项与该类型一起使用时,会将前缀“ 0x”添加到输出值中。
'X' 十六进制格式。输出以16为进制的数字,对9以上的数字使用大写字母。将'#'选项与该类型一起使用时,会将前缀“ 0X”添加到输出值中。
'L' 特定于语言环境的格式。这与'd'相同,除了它使用当前的语言环境设置来插入适当的数字分隔符。
none 与 'd' 相同

16、整数表示类型也可以与字符和布尔值一起使用。如果未指定输出类型,布尔值使用文本表示形式设置为true或false,

17、浮点值的可用显示类型为:

Type Meaning

'a' 十六进制浮点格式。打印以16为底的数字,前缀为“ 0x”,小写字母表示9以上的数字。使用'p'表示指数。

'A' 与 'a' 相同,不同之处在于它使用大写字母作为前缀,数字大于9并表示指数。

'e' 指数表示法。使用字母“ e”以科学计数法打印数字以表示指数。

'E' 指数表示法。与'e'相同,除了它使用大写字母'E'作为分隔符。

'f' 固定点。将数字显示为定点数字。

'F' 固定点。与'f'相同,但是将nan转换为NAN,将inf转换为INF。

'g' 通用格式。对于给定的精度p > = 1,这会将数字四舍五入为p个有效数字,然后根据结果的大小以定点格式或科学计数法格式化结果。精度0等同于精度1。

'G' 通用格式。与“ g”相同,但如果数字太大则切换到 'E'。无限大和NaN的表示也都是大写的。

'L' 特定于语言环境的格式。这与'g'相同,只是它使用当前的语言环境设置来插入适当的数字分隔符。

none 与“'g'相似,不同之处在于定点表示法在使用时,其小数点后至少有一位数字。默认精度与表示特定值所需的精度一样高。

18、指针的可用显示类型为:

Type Meaning

'p' 指针格式。这是指针的默认类型,可以省略。

none 与 'p'相同

D、格式范例

本节包含格式语法的示例以及与printf格式的比较。

1、大多数情况下,语法类似于printf格式,加上{} 和 :代替%。例如,“%03.2f”可以转换为“{ :03.2f }”。

2、新格式的语法还支持新的和不同的选项,如以下示例所示。

2.1、按位置访问参数:

fmt::format("{0}, {1}, {2}", 'a', 'b', 'c');
// Result: "a, b, c"
fmt::format("{}, {}, {}", 'a', 'b', 'c');
// Result: "a, b, c"
fmt::format("{2}, {1}, {0}", 'a', 'b', 'c');
// Result: "c, b, a"
fmt::format("{0}{1}{0}", "abra", "cad");
// Result: "abracadabra"

2.2、对齐文本并指定宽度:

fmt::format("{:<30}", "left aligned");
// Result: "left aligned "
fmt::format("{:>30}", "right aligned");
// Result: " right aligned"
fmt::format("{:^30}", "centered");
// Result: " centered "
fmt::format("{:*^30}", "centered"); // use '*' as a fill char
// Result: "***********centered***********"

2.3、动态宽度:

fmt::format("{:<{}}", "left aligned", 30);
// Result: "left aligned

2.4、动态精度:

fmt::format("{:.{}f}", 3.14, 1);
// Result: "3.1"

2.5、% + f,% - f和%f并指定符号:

fmt::format("{:+f}; {:+f}", 3.14, -3.14);  // show it always
// Result: "+3.140000; -3.140000"
fmt::format("{: f}; {: f}", 3.14, -3.14); // show a space for positive numbers
// Result: " 3.140000; -3.140000"
fmt::format("{:-f}; {:-f}", 3.14, -3.14); // show only the minus -- same as '{:f}; {:f}'
// Result: "3.140000; -3.140000"

2.6、%x和%o并将值转换为不同的进制:


fmt::format("int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}", 42);
// Result: "int: 42; hex: 2a; oct: 52; bin: 101010"
// with 0x or 0 or 0b as prefix:
fmt::format("int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}", 42);
// Result: "int: 42; hex: 0x2a; oct: 052; bin: 0b101010"

2.7、用前缀填充十六进制字节,并始终打印两个十六进制字符:

fmt::format("{:#04x}", 0);
// Result: "0x00"

2.8、使用Unicode填充的方框图:

fmt::print(
"┌{0:─^{2}}┐\n"
"│{1: ^{2}}│\n"
"└{0:─^{2}}┘\n", "", "Hello, world!", 20);

输出结果:

┌────────────────────┐
│ Hello, world!│
└────────────────────┘

2.9、使用特定于类型的格式:  

#include <fmt/chrono.h>

auto t = tm();
t.tm_year = 2010 - 1900;
t.tm_mon = 6;
t.tm_mday = 4;
t.tm_hour = 12;
t.tm_min = 15;
t.tm_sec = 58;
fmt::print("{:%Y-%m-%d %H:%M:%S}", t);
// Prints: 2010-08-04 12:15:58

2.10、使用逗号作为千位分隔符:

#include <fmt/locale.h>

auto s = fmt::format(std::locale("en_US.UTF-8"), "{:L}", 1234567890);
// s == "1,234,567,890"

------------完------------ -

可见fmt的强大之处,类比python的格式化。 c++传统的格式化也该扫进历史的垃圾桶了。

还等什么,赶紧试试吧。

github fmt库语法+范例(fmt version :7.0.1)的更多相关文章

  1. win10 1909+ vs2015up3 使用fmt概述(fmt version 7.0.1)

    !!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist fmt 源码: https://github.com/fmtlib/fmt fmt官方文档: ...

  2. win10使用cmake配置fmt生成vs2015解决方案(fmt version 7.0.1)

    !!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist 本文仅为参考,请以实际情况为准, fmt版本: 7.0.1 准备 下载源码fmt : htt ...

  3. go标准库的学习-fmt

    参考https://studygolang.com/pkgdoc 导入方式: import "fmt" mt包实现了类似C语言printf和scanf的格式化I/O.格式化动作(' ...

  4. Go语言fmt库的print函数源码解析

    // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a B ...

  5. nim_duilib(13)之添加fmt库

    introduction 习惯使用fmt库做字符串的格式化操作.尽管nim_duilib提供了类似的函数. 故项目demo_xml引入了外部库fmt framework.h中添加下面的以便使用fmt库 ...

  6. 利用cocoapods管理开源项目,支持 pod install安装整个流程记录(github公有库)

    利用cocoapods管理开源项目,支持 pod install安装整个流程记录(github公有库),完成预期的任务,大致有下面几步: 1.代码提交到github平台 2.创建.podspec 3. ...

  7. GitHub开源库排名一百的简单介绍,值得收藏!

    GitHub Android Libraries Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitHub ...

  8. GitHub远程库的搭建以及使用

    GitHub远程库的搭建 一).配置SSH 步骤: 1).注册GitHub账号 2).本地git仓库与远程的GitHub仓库的传输要通过SSH进行加密 3).创建SSH key ​ 1.检查在用户主目 ...

  9. 我的github代码库

    我的github代码库地址:https://github.com/gooree.Enjoy coding,enjoy sharing.

随机推荐

  1. NOIP 2020 游记

    第一次写比赛游记,请多多指教! I. 考前 由于最近参加了太多太多比赛了,所以没有敲模板题: 考前一周:主要是在做 AtCoder 的题和 xjoi 的模拟赛,相当于恶补了一些套路吧! 考前一天:上午 ...

  2. 9 Days 停课修炼题解集

    xj4604 排序 \(n,k <= 1e5\). 先考虑二分出这个值,check 有多少段的平均值小于这个 mid,这个在之前的复活赛中是原题 T4,数形结合,$ \text{Average} ...

  3. 自动添加shell脚本头部信息

    autocmd BufNewFile *.sh exec ":call AddTitleForShell()" function AddTitleForShell() call a ...

  4. Tikz绘制形似万花尺的图片

    初中时意外发现数学课本上有这么一个好玩的图 大概就是把两条相等线段A.B分为10个小段并在点上标序号,A线段1点连B线段9点,2点连8点,依次类推. 假设有这么一个框架图 按照第一张图的方式进一步绘图 ...

  5. 【模板】缩点(Tarjan算法)/洛谷P3387

    题目链接 https://www.luogu.com.cn/problem/P3387 题目大意 给定一个 \(n\) 个点 \(m\) 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之 ...

  6. 一次线上GC故障解决过程记录

    排查了三四个小时,终于解决了这个GC问题,记录解决过程于此,希望对大家有所帮助.本文假定读者已具备基本的GC常识和JVM调优知识,关于JVM调优工具使用可以查看我在同一分类下的另一篇文章: http: ...

  7. 学习java的第十三天

    一.今日收获(前两天家里有事,博客都忘了发了,唉) 1.通过看哔哩哔哩看黑马程序员的教学视频,学习了java中的数据类型自动转换.强制转换及注意事项三节 2.简单看了看完全学习手册 二.今日问题 1. ...

  8. javascript的原型与原型链

    首先套用一句经典名言,JavaScript中万物皆对象. 但是对象又分为函数对象和普通对象. function f1(){}; var f2=function(){}; var f3=new Func ...

  9. Hive(一)【基本概念、安装】

    目录 一. Hive基本概念 1.1 Hive是什么 1.2 Hive的优缺点 1.3 Hive的架构 1.4 Hive和数据库的区别 二. Hive安装 2.1 安装地址 2.2 Mysql的安装 ...

  10. Linux FTP的主动模式与被动模式

    Linux FTP的主动模式与被动模式 一.FTP主被动模式        FTP是文件传输协议的简称,ftp传输协议有着众多的优点所以传输文件时使用ftp协议的软件很多,ftp协议使用的端口是21( ...