c++ fmt中引用值后填写

gcmastyq  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(154)

我想用C++ fmt来填充一个带引号的值,我知道我可以一步完成引号,然后用fmt和一个参数,但是我认为这会比较慢,从可读性的Angular 来看,我想一步完成,我有这个solution
但IS似乎有点笨重,我是手动做对齐计算会计的事实,我有引号周围的值...

#include <array>
#include <string>
#include <iostream>
#include <fmt/format.h>


void write_padded(const int i,char* data) {
    // note: - format_to_n will not zero termiante if out of space
    //       - use '^' as a fill char for visibility
    auto result = fmt::format_to_n(data,7, R"("{}{:^<5})",i,'\"');
    *result.out = '\0';
}

int main() {
    // space for 5 digits, 2 quotes \0
    std::array<char, 8> data{};
    write_padded(1, data.data());
    std::cout << data.data() << std::endl;
    write_padded(10, data.data());
    std::cout << data.data() << std::endl;
    write_padded(123456789, data.data());
    std::cout << data.data() << std::endl;
    write_padded(54321, data.data());
    std::cout << data.data() << std::endl;    
}

这似乎工作,但我想这样做没有我做手工计算宽度。也许也有一个更好的格式字符串。
注意:我知道整数可以超过5位数,而且幻数是不好的,但即使有命名变量,我仍然需要做计算。

goqiplq2

goqiplq21#

您可以编写一个进行引用的格式化程序,例如:

#include <fmt/format.h>

struct quoted {
  int value;
};

template <>
struct fmt::formatter<quoted> : formatter<string_view> {
  auto format(quoted q, format_context& ctx) const {
    auto buf = fmt::memory_buffer();
    fmt::format_to(std::back_inserter(buf), "\"{}\"", q.value);
    return formatter<string_view>::format({buf.data(), buf.size()}, ctx);
  }
};

int main() {
  fmt::print("{:^<7}\n", quoted{1});
}

这个打印

"1"^^^^

https://godbolt.org/z/Gs5qPTT13

相关问题