使用* Width&精度说明符使用boost :: format

时间:2010-06-04 22:03:39

标签: c++ boost

我正在尝试使用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会抛出异常。

有没有办法实现相同的目标,最好是使用直接替换?

2 个答案:

答案 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在评论中发布第二个想法)