Я пытаюсь использовать спецификаторы ширины и точности с 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
не поддерживает *
спецификатор. Повышение выдает исключение при парсинге строки.
Существует ли способ выполнить ту же цель, предпочтительно с помощью общедоступной замены?
Попробуйте следующее:
#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-манипуляторов с параметром.
Что ж, это не добавление, но один из способов сделать это - динамически построить строку формата:
#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();
(кредит Ферруччо за размещение второй идеи в комментариях)