Trunchate C ++ строковые поля, сгенерированные OSTRINGSTREAM, IOMONIP: SETW

StackOverflow https://stackoverflow.com/questions/2900392

Вопрос

В 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")
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top