Скажем, у вас есть что-то вроде:
std::ostringstream oss;
int value(42);
oss.fill('0');
oss << std::setw(3) << value;
cout << oss.str();
ВЫХОД: 042
Это вывод, потому что std :: setw обеспечивает минимальную ширину, и мы сказали потоку заполнить 0, однако как вы делаете обратное и задаете максимальную ширину, чтобы отображение было усечено в STL и предпочтительно в собственном C ++ .. .
В настоящее время у меня есть кое-что, что я считаю уродливым и неэффективным взломом:
std::ostringstream oss;
int value(1239999);
oss.fill('0');
oss << std::setw(3) << boost::lexical_cast<std::string, int>(value).substr(0, 3);
cout << oss.str();
ВЫХОД: 123
Я смотрел на boost :: format, но там такая же история, насколько я могу судить, что нет способа сделать это "красиво" ... есть предложения?
UPDATE: потоки std :: ostringstream и STL в целом, как известно, работают медленнее по сравнению с другими контейнерами и шаблонными объектами STL. Возможно, мне было бы лучше создать объект очереди сообщений, который обертывает и внутренне использует std :: queue, а затем просто использует sprintf_s для форматирования?