Переключение между различными стилями числового форматирования в iostream

У меня есть вывод программы C ++ для записи в iostreamОднако мне нужно часто переключаться между различными числовыми стилями, например, между научным и ненаучным. Вот что я смотрю на:

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
cout << setw(2) << 1 << ' ' << setw(4) << 0.25 << ' ';
cout.width(6);
cout.setf(ios::scientific, ios::floatfield);
cout << 3.0 << ' ';
cout.unsetf(ios::floatfield);
cout << 4.0 << ' ';
cout.setf(ios::scientific, ios::floatfield);
cout << 3.0 << ' ';
cout.unsetf(ios::floatfield);
cout << 4.0 << endl;
return 0;
}

Требуется ли эта нелепость? Это выглядит ужасно. Для сравнения, это выглядит намного более вменяемым в C:

#include <stdio.h>

int main()
{
printf("%2d %4g %6e %6g %6e %6g\n", 1, 0.25, 3.0, 4.0, 3.0, 4.0);
return 0;
}

Есть ли способ использовать iostream в С ++ чтобы было легче читать?

2

Решение

Это также может быть излишним, но вы могли бы реализовать некоторые легкие типы, которые сделали пользовательское форматирование для вас

struct Scientific
{
double value;
Scientific(double value) : value(value) { }
};

ostream& operator<< (ostream &o, const Scientific& p) {
o.setf(ios::scientific, ios::floatfield);
o << p.value;
o.unsetf(ios::floatfield);
return o;
}

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

cout << 1 << ' ' << Scientific(2.0) << ' ' << endl;
3

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

Другим способом может быть использование макросов:

#include <iostream>
#include <iomanip>

using std::hex;
using std::scientific;
using std::cout;
using std::endl;

define H hex
define S scientific

int main(int argc, char **argv) {
cout << H << 10 << S << 10 << endl;

return 0;
}
0

По вопросам рекламы [email protected]