c++ - fmt std::string 显示为数字
问题描述
我试图格式化一个将显示在控制台中的简单字符串
long long duration = end - start;
double ms = static_cast<double>(duration) * 0.001;
std::string resoult = fmt::format("{} => Duration: {} micro, {} ms", m_Info.c_str(), duration, ms);
AE_TRACE(resoult);
其中 m_Info 是 std::string,duration 是 long long,ms 是 double。结果如下所示:
-9891888000000.0 => Duration: 49172 micro, 412316861 ms
std::string 显示为随机数,ms 应该是 49,172。
我试过了
"{:s} => Duration: {:d} micro, {:f} ms"
但这导致了fmt::format_errror
。我在同一个项目的其他文件中使用了相同的库,并且没有收到此类错误。
编辑
我在同一部分代码中使用了其他一些 fmt 函数
long long duration = end - start;
double ms = duration * 0.001;
std::string test = "test";
fmt::memory_buffer temp;
fmt::format_to(temp, "{} {} {}", test, duration, ms);
AE_TRACE(fmt::format("{} {} {}", test, duration, ms));
AE_TRACE(temp.data());
AE_TRACE("{} {} {}"_format(test, duration, ms));
AE_TRACE(test);
在所有这些中std::string
,double
都显示为一些随机数。最后一个函数std::string
正确打印了未格式化的内容,当我尝试使用long long
and时也发生了同样的情况double
。
解决方案
您没有提供足够的信息来调试它,但可能是您的 fmtlib 副本和 spdlog 中的副本彼此不喜欢。spdlog 提供了一个 cmake 配置变量来防止这种情况发生,即(来自我的 cmake 文件)
set(SPDLOG_FMT_EXTERNAL ON CACHE BOOL "Use common fmtlib")
你可能想试试这个。
推荐阅读
- ios - 在iOS 11以下检查CMMotionActivityManager的授权
- python - Python:将二维数组插入 Mysql 数据库
- mysql - 使用主键更新行时 MariaDB 死锁
- angular - 如何显示所选值的数据?
- vue.js - 如何访问 vue-good-table 中的标头索引
- html - 结果进入控制台但无法在循环内打印
- reactjs - 分派和减少操作后组件不重新呈现
- javascript - 如何在每个函数中使用循环对多个函数进行异步处理
- php - 谷歌正在显示我的旧网址,如何从谷歌索引中删除它并将我的新网址添加到谷歌索引中?
- python - 使用 Eve 运行 python 代码的 ValueError 问题