c++使用fmt::format格式化字符串

最新的vs2019 16.10.0版本已经添加了对format的支持。只需要设置C++标准为std:c++latest ,然后头文件直接包含 #include <format> 然后把下面的fmt::format替换成std::format即可

C++格式化字符串一直是个老大难,要么用系统API,要么用C库函数,要么自己写。最近std::format终于在C++20来了。。。cpp在一边不停加入新特性,实用的东西还是不少,比如cpp11的多线程支持,cpp17的filesystem等等,而网络库还不知道在哪。但是这些东西似乎来得太迟。cpp的现状却是很惨。其它语言很快崛起很大的原因就是基础库很全,你可以烂,可以不好用,但你不能没有啊。什么轮子都要自己造。吐槽完毕。

而vs2019仍然没有加入std::format支持,所以先自己用fmt::format。当然这个库可以编译成动态静态库,也可以header-only。

不想编译,我直接用它的header-only 先在项目属性的预处理器里加上FMT_HEADER_ONLY=1,把fmt的include加入附加包含目录然后在项目 加入如下头文件。如果使用库方式则不需要format.cc。但是需要链接相应的库。

#include <fmt\core.h>
#include <fmt\format.h>
#include <..\src\format.cc>

因为我这里是加的include 目录到附加包含目录。所以format.cc需要返回上一层。

来打印一个简单的99加法表

void formatxx()
{
	for (int first = 1; first < 10; first++)
	{
		for (int second = 1; second < first+1; second++)
		{
			auto str = fmt::format("{1}+{0}={2:<2}", first,second, first+second);
			std::cout << str << " ";
		}
		std::cout<< std::endl;
	}
}

运行效果如上。

可以看到它的标准格式{}内为格式化参数。标准精确定位为 {argid:format} argid对应后面参数的位置,需要注意的argid可以省略则按参数顺序依次匹配。argid要么全省略要么全写,不能混合使用。

具体的格式化字符串这里就不写了参见:https://zh.cppreference.com/w/cpp/utility/format/formatter#.E6.A0.87.E5.87.86.E6.A0.BC.E5.BC.8F.E8.AF.B4.E6.98.8E

如果要格式化时间参见:https://zh.cppreference.com/w/cpp/chrono/system_clock/formatter#.E6.A0.BC.E5.BC.8F.E8.AF.B4.E6.98.8E

fmt::format是完全兼容std::format的。至于进到标准库会不会减少功能很难说。

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值