如何用C++ fmt在带引号值后填充,避免手动计算宽度?
解决C++ fmt库带引号值的自动对齐填充问题
方法1:嵌套fmt::format(快速实现,无需额外代码)
直接将带引号的内容作为一个整体传入对齐格式,fmt会自动计算包含引号的总宽度,无需手动减去引号的2个字符宽度。示例:
#include <fmt/core.h> int main() { int val = 1234; // 右对齐,总宽度12(包含两侧引号) fmt::print("{:>12}\n", fmt::format("\"{}\"", val)); // 左对齐,总宽度12 fmt::print("{:<12}|\n", fmt::format("\"{}\"", val)); // 居中对齐,总宽度12 fmt::print("{:^12}\n", fmt::format("\"{}\"", val)); }
输出结果:
"1234" "1234" | "1234"
方法2:自定义格式化器(高效,一步到位)
如果追求更高效率(避免中间字符串生成),可以封装一个Quoted包装器并特化fmt格式化器,直接在格式化时自动添加引号,同时支持所有原生格式说明:
#include <fmt/core.h> // 包装器,用于标记需要带引号格式化的值 template <typename T> struct Quoted { const T& value; }; // 辅助函数,快速创建Quoted对象 template <typename T> Quoted<T> quoted(const T& val) { return {val}; } // 特化fmt格式化器,自动添加双引号 template <typename T> struct fmt::formatter<Quoted<T>> : fmt::formatter<T> { template <typename FormatContext> auto format(const Quoted<T>& q, FormatContext& ctx) const { fmt::format_to(ctx.out(), "\""); // 复用原生类型的格式化逻辑 fmt::formatter<T>::format(q.value, ctx); fmt::format_to(ctx.out(), "\""); return ctx.out(); } }; int main() { int num = 98765; // 直接指定总宽度15,自动包含引号 fmt::print("{:>15}\n", quoted(num)); // 支持数值格式说明,比如保留2位小数(针对浮点数) double pi = 3.14159; fmt::print("{:<10.2f}\n", quoted(pi)); }
输出结果:
"98765" "3.14"
两种方法都无需手动计算对齐宽度,直接指定最终需要的总宽度即可,完全满足可读性和效率要求。
内容的提问来源于stack exchange,提问作者NoSenseEtAl
相关产品推荐
相关产品推荐

