Форматирование вывода в переполнении стека

В коде C ++ у меня есть матрица двойных переменных, которые я распечатываю. Однако, поскольку все они имеют разное количество цифр, выходной формат уничтожается. Одним из решений является сделать
cout.precision(5) но я хочу, чтобы разные столбцы имели разную точность. Кроме того, поскольку в некоторых случаях существуют отрицательные значения, наличие - знак также вызывает проблемы. Как обойти это и произвести правильно отформатированный вывод?

13

Решение

Вне моей головы, вы можете использовать setw (int), чтобы указать ширину вывода.

как это:

std::cout << std::setw(5) << 0.2 << std::setw(10) << 123456 << std::endl;
std::cout << std::setw(5) << 0.12 << std::setw(10) << 123456789 << std::endl;

дает это:

    0.2    123456
0.12 123456789
12

Другие решения

Ключ, как уже говорили другие, использовать манипуляторы. То, что они
забыли сказать, что вы обычно используете манипуляторы, которые вы пишете
сам. FFmt манипулятор (который соответствует F отформатировать в
Фортран довольно прост:

class FFmt
{
int myWidth;
int myPrecision;
public:
FFmt( int width, int precision )
: myWidth( width )
, myPrecision( precision )
{
}

friend std::ostream&
operator<<( std::ostream& dest, FFmt const& fmt )
{
dest.setf( std::ios_base::fixed, std::ios_base::formatfield );
dest.precision( myPrecision );
dest.width( myWidth );
return dest;
}
};

Таким образом, вы можете определить переменную для каждого столбца, скажем:

FFmt col1( 8, 2 );
FFmt col2( 6, 3 );
//  ...

и писать:

std::cout  << col1 << value1
<< ' ' << col2 << value2...

В общем, кроме самых простых программ, вы, вероятно, не должны быть
используя стандартные манипуляторы, а точнее собственные манипуляторы на основе
ваше приложение; например temperature а также pressure если это что-то вроде
вещь, с которой вы имеете дело. Таким образом, в коде ясно, что
вы форматируете, и если клиент вдруг запрашивает еще одну цифру в
давление, вы точно знаете, где внести изменения.

14

использование манипуляторы.

Из образца Вот:

#include <iostream>
#include <iomanip>
#include <locale>
int main()
{
std::cout.imbue(std::locale("en_US.utf8"));
std::cout << "Left fill:\n" << std::left << std::setfill('*')
<< std::setw(12) << -1.23  << '\n'
<< std::setw(12) << std::hex << std::showbase << 42 << '\n'
<< std::setw(12) << std::put_money(123, true) << "\n\n";

std::cout << "Internal fill:\n" << std::internal
<< std::setw(12) << -1.23  << '\n'
<< std::setw(12) << 42 << '\n'
<< std::setw(12) << std::put_money(123, true) << "\n\n";

std::cout << "Right fill:\n" << std::right
<< std::setw(12) << -1.23  << '\n'
<< std::setw(12) << 42 << '\n'
<< std::setw(12) << std::put_money(123, true) << '\n';
}

Выход:

Left fill:
-1.23*******
0x2a********
USD *1.23***

Internal fill:
-*******1.23
0x********2a
USD ****1.23

Right fill:
*******-1.23
********0x2a
***USD *1.23
6

Взгляни на ручей манипуляторы, особенно std::setw а также std::setfill,

float f = 3.1415926535;
std::cout << std::setprecision(5)   // precision of floating point output
<< std::setfill(' ')      // character used to fill the column
<< std::setw(20)          // width of column
<< f << '\n';             // your number
1

Попробуйте использовать setw манипулятор. Пожалуйста, обратитесь http://www.cplusplus.com/reference/iostream/manipulators/setw/ для дополнительной информации

0

Есть способ использовать манипуляторы ввода / вывода, но я считаю его громоздким. Я бы просто написал такую ​​функцию:

template<typename T>
std::string RightAligned(int size, const T & val)
{
std::string x = boost::lexical_cast<std::string>(val);
if (x.size() < size)
x = std::string(size - x.size(), ' ') + x;
return x;
}
0
По вопросам рекламы [email protected]