В коде C ++ у меня есть матрица двойных переменных, которые я распечатываю. Однако, поскольку все они имеют разное количество цифр, выходной формат уничтожается. Одним из решений является сделать
cout.precision(5)
но я хочу, чтобы разные столбцы имели разную точность. Кроме того, поскольку в некоторых случаях существуют отрицательные значения, наличие -
знак также вызывает проблемы. Как обойти это и произвести правильно отформатированный вывод?
Вне моей головы, вы можете использовать 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
Ключ, как уже говорили другие, использовать манипуляторы. То, что они
забыли сказать, что вы обычно используете манипуляторы, которые вы пишете
сам. 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
если это что-то вроде
вещь, с которой вы имеете дело. Таким образом, в коде ясно, что
вы форматируете, и если клиент вдруг запрашивает еще одну цифру в
давление, вы точно знаете, где внести изменения.
использование манипуляторы.
Из образца Вот:
#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
Взгляни на ручей манипуляторы, особенно 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
Попробуйте использовать setw манипулятор. Пожалуйста, обратитесь http://www.cplusplus.com/reference/iostream/manipulators/setw/ для дополнительной информации
Есть способ использовать манипуляторы ввода / вывода, но я считаю его громоздким. Я бы просто написал такую функцию:
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;
}