You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:25:21