Trunchate C ++ строковые поля, сгенерированные OSTRINGSTREAM, IOMONIP: SETW
-
04-10-2019 - |
Вопрос
В C ++ мне нужны строковые представления целых чисел с ведущими Zeroes, где представление имеет 8 цифр и не более 8 цифр, усеченные цифры на правой стороне при необходимости. Я думал, что могу сделать это, используя просто OstringStream и iomanip.setw (), как это:
int num_1 = 3000;
ostringstream out_target;
out_target << setw(8) << setfill('0') << num_1;
cout << "field: " << out_target.str() << " vs input: " << num_1 << endl;
Вывод вот:
field: 00003000 vs input: 3000
Очень хорошо! Однако, если я попробую более широкий номер, SETW позволяет выводить вывод за пределы 8 символов:
int num_2 = 2000000000;
ostringstream out_target;
out_target << setw(8) << setfill('0') << num_2;
cout << "field: " << out_target.str() << " vs input: " << num_2 << endl;
out_target.str("");
выход:
field: 2000000000 vs input: 2000000000
Желаемый выход «20000000». Там ничего не останавливает меня с использованием второй операции, чтобы взять только первые 8 символов, но является полевой усечением, по-настоящему не хватает от iomanip? Будет ли форматирование усиления делать то, что мне нужно за один шаг?
Решение
Я не могу подумать о каком-либо способе обрезать числовое поле такое. Возможно, это не было реализовано, потому что это изменило бы значение.
ostream::write()
позволяет усечить нить Буфер просто достаточно, как в этом примере ...
int num_2 = 2000000000;
ostringstream out_target;
out_target << setw(8) << setfill('0') << num_2;
cout << "field: ";
cout.write(out_target.str().c_str(), 8);
cout << " vs input: " << num_2 << endl;
Другие советы
Если вы предполагаете, что SNPRINTF () напишет как можно больше символов (я не думаю, что это гарантировано),
char buf[9];
snprintf(buf, 10, "%08d", num);
buf[8] = 0;
cout << std::string(buf) << endl;
Я не уверен, что вы хотите 2 миллиарда, чтобы быть такими же, как 20 миллионов. Может иметь больше смысла сигналировать ошибку при усечении, как это:
if (snprintf(buf, 10, "%08d", num) > 8) {
throw std::exception("oops")
}