Ответ 1
Существует три варианта заполнения, left
, right
и internal
.
Вы хотите internal
отступы между значком и значением.
stream << std::setfill( '0' ) << std::internal; // Zero-padded
Я использую 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;
}
Существует три варианта заполнения, left
, right
и internal
.
Вы хотите internal
отступы между значком и значением.
stream << std::setfill( '0' ) << std::internal; // Zero-padded
Вы можете использовать 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;
}
Символ заполнения используется с любым, чтобы заполнить заданную ширину. По умолчанию символы заполнения идут влево от значения, и это то, что вы видите с этими нулями. Решение состоит в том, чтобы переопределить это значение по умолчанию и сообщить потоку для ввода символов заполнения внутри текста:
std::cout << std::internal << std::setfill(0) << std::setw(3) << 1 << '\n';
Вы также можете использовать std::left
или std::right
, чтобы поместить символы заполнения слева от значения или справа от значения.
Это, к сожалению, как это должно работать. "0" используется как символ заполнения, а не как часть числа.
Чтобы исправить это, вы должны вывести + или - отдельно:
std::ostringstream oss;
oss << "+-"[x<0];
oss << std::setw(2) << std::setfill('0') << std::abs(x);
return/cout/whatever oss.str();