Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using * Width & Precision Specifiers With boost::format

Tags:

c++

boost

I am trying to use width and precision specifiers with boost::format, like this:

#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;
}

But this doesn't work because boost::format doesn't support the * specifier. Boost throws an exception when parsing the string.

Is there a way to accomplish the same goal, preferably using a drop-in replacement?

like image 689
John Dibling Avatar asked Jun 04 '10 22:06

John Dibling


2 Answers

Try this:

#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() lets you encapsulate one or more io manipulators with a parameter.

like image 178
Ferruccio Avatar answered Sep 20 '22 06:09

Ferruccio


Well, this isn't a drop-in, but one way to do it would be to construct the format string dynamically:

#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();
}

Of course, if you did this frequently, you could refactor construction of the format string into a function.

You could also use boost::format() to generate the format string; it's shorter, but potentially less readable, especially for long format strings:

const std::string f = (boost::format("%%%d.%ds") % (n*2) % (n*2)).str();
std::string s = (boost::format(f) % "Hello").str();

(credit to Ferruccio for posting the second idea in the comments)

like image 45
James McNellis Avatar answered Sep 21 '22 06:09

James McNellis