Подтвердить что ты не робот

Std:: ostringstream помещает знак в неправильное местоположение?

Я использую std:: ostringstream для форматирования двойной строки в определенном формате (используя апострофы в качестве разделителей тысяч). Однако в некоторых случаях ostringstream дал мне отличный результат от того, что я ожидал.

Насколько я могу судить, ожидаемый вывод кода ниже должен быть "+01"; вместо этого он выводит "0 + 1". Что я делаю неправильно здесь, и как я могу получить результат, который мне нужен?

#include <iomanip>
#include <iostream>
#include <sstream>

int main() 
{
    std::ostringstream stream;
    stream << std::showpos; // Always show sign
    stream << std::setw(3); // Minimum 3 characters
    stream << std::setfill( '0' ); // Zero-padded
    stream << 1; // Expected output: "+01"

    std::cout << stream.str(); // Output: "0+1"
    return 0;
}

Код на идее

4b9b3361

Ответ 1

Существует три варианта заполнения, left, right и internal.

Вы хотите internal отступы между значком и значением.

stream << std::setfill( '0' ) << std::internal; // Zero-padded

Ответ 2

Вы можете использовать std::internal juste перед std::showpos (как показано здесь).

Нам нужно добавить std:: внутренний флаг, чтобы сообщить потоку вставить "внутреннее заполнение" - то есть добавление должно быть вставлено между значком и остальной частью номера.

#include <iomanip>
#include <iostream>
#include <sstream>

int main() 
{
    std::ostringstream stream;

    stream << std::setfill('0');
    stream << std::setw(3);
    stream << std::internal;
    stream << std::showpos;
    stream << 1; 

    std::cout << stream.str(); // Output: "+01"
    return 0;
}

Ответ 3

Символ заполнения используется с любым, чтобы заполнить заданную ширину. По умолчанию символы заполнения идут влево от значения, и это то, что вы видите с этими нулями. Решение состоит в том, чтобы переопределить это значение по умолчанию и сообщить потоку для ввода символов заполнения внутри текста:

std::cout << std::internal << std::setfill(0) << std::setw(3) << 1 << '\n';

Вы также можете использовать std::left или std::right, чтобы поместить символы заполнения слева от значения или справа от значения.

Ответ 4

Это, к сожалению, как это должно работать. "0" используется как символ заполнения, а не как часть числа.

Чтобы исправить это, вы должны вывести + или - отдельно:

std::ostringstream oss;
oss << "+-"[x<0];
oss << std::setw(2) << std::setfill('0') << std::abs(x);
return/cout/whatever oss.str();