最新的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的。至于进到标准库会不会减少功能很难说。