Скажем, у вас есть что-то вроде:
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, но там та же история, насколько я могу судить, нет способа сделать это "красиво" ... есть предложения?
ОБНОВЛЕНИЕ: потоки std :: ostringstream и STL в целом, как известно, работают медленно по сравнению с другими контейнерами и объектами шаблонов STL. Возможно, мне было бы лучше создать объект очереди сообщений, который обертывает и внутренне использует std :: queue, а затем просто использует sprintf_s для целей форматирования?
"123"
является правильным представлением как123
, так и1239999
? Если это правда, я не думаю, что у вас вообще есть целые числа. - person SingleNegationElimination   schedule 16.12.2010