我正在尝试使用boost::format
的宽度和精度说明符,如下所示:
#include <boost\format.hpp>
#include <string>
int main()
{
int n = 5;
std::string s = (boost::format("%*.*s") % (n*2) % (n*2) % "Hello").str();
return 0;
}
但这不起作用,因为boost::format
不支持*
说明符。解析字符串时,Boost会抛出异常。
有没有办法实现相同的目标,最好是使用直接替换?
答案 0 :(得分:8)
试试这个:
#include <boost/format.hpp>
#include <iomanip>
using namespace std;
using namespace boost;
int main()
{
int n = 5;
string s = (format("%s") % io::group(setw(n*2), setprecision(n*2), "Hello")).str();
return 0;
}
group()允许您使用参数封装一个或多个io操纵器。
答案 1 :(得分:2)
嗯,这不是一个插件,但一种方法是动态构造格式字符串:
#include <boost/format.hpp>
#include <boost/lexical_cast.hpp>
int main()
{
int n = 5;
const std::string f("%" +
boost::lexical_cast<std::string>(n * 2) + "." +
boost::lexical_cast<std::string>(n * 2) + "s");
std::string s = (boost::format(f) % "Hello").str();
}
当然,如果您经常这样做,您可以将格式字符串的构造重构为函数。
您还可以使用boost::format()
生成格式字符串;它更短,但可能性更低,特别是对于长格式字符串:
const std::string f = (boost::format("%%%d.%ds") % (n*2) % (n*2)).str();
std::string s = (boost::format(f) % "Hello").str();
(感谢Ferruccio在评论中发布第二个想法)