C++的String.Format函数

28
寻找C++的实现,类似于.NET的String.Format函数。显然有printf和它的变种,但我正在寻找像下面这样位置相关的函数:
String.Format("Hi there {0}. You are {1} years old. How does it feel to be {1}?", name, age);
这是因为我们将尝试使本地化应用程序更容易,为翻译人员提供{0}和{1}以在句子中任意位置放置要比提供必须按顺序放置在翻译中的%s、%d、%d等符号更容易。
我想用可变输入进行搜索和替换(va_start,va_end等),但如果已经有一个稳定的解决方案,那就更好了。
谢谢 :)
13个回答

0

0

iostream:

stringstream s;
string a;
s << "this is string a: " << a << endl;

你可以使用类似于sprintf的格式化方式(搜索“iostream format”),它是C++标准中的一部分。

他正在寻找位置参数,就像在C#中一样。 - Eddie Parker
“positional” 意味着他可以说 'printPositional("{0} this is string a {1}", s, a)' 并且 'printPositional("{1} this is string b {0}", b, s)' 并获得正确的结果。 - Max Lybbert
使用stringstream确实可行(并且还支持许多其他数据类型),所以+1——但是,当您想要组合许多变量时,我发现它可能会变得非常混乱,这就是为什么使用sprintf更整洁的原因(即使它来自C lib)。话虽如此,sprintf确实有一个缺点;您需要使用具有固定大小的缓冲区。因此,我认为boost是最好的选择。 - Nick Bolton

0
除了其他人提出的选项之外,我还可以推荐fmt库,它实现了类似于Python中的str.format和C#中的String.Format的字符串格式化。以下是一个示例:
string result = fmt::format("Hi {0}. You are {1} years old.", name, age);

这个库完全是类型安全的,而且比 Boost Format 快得多

免责声明:我是这个库的作者。


很好,谢谢!但是我不得不将扩展名更改为cpp才能使其工作,否则在链接时会出现奇怪的未定义错误。 - user2440074
@AlekDepler 很高兴你喜欢它。至于扩展,它应该可以与所有主要编译器(GCC、Clang、MSVC)一起使用。你使用哪个编译器? - vitaut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接