Почему я не могу использовать fixed и setprecision () с оператором + для строк вместо оператора & lt; & lt; для cout

Почему я не могу использовать «fixed» и «setprecision ()» с оператором +, чтобы отформатировать его в строку, и что я могу использовать его только с оператором «меньше, чем меньше», чтобы отформатировать его для cout. Какие еще способы я могу реализовать это?

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
double a = 157.2734;
cout << "This number is " << fixed << setprecision(1) << a << "." << endl;
string line = "This number is " + fixed + setprecision(1) + a + "." + "\n"; // This doesn't work this way! Why!?!?!?
cout << line;
return 0;
}

1

Решение

Почему я не могу использовать «fixed» и «setprecision ()» с оператором + для форматирования его в строку?

Присмотритесь std::fixed а также std::setprecision().

Полная подпись std::fixed:

std::ios_base& fixed(std::ios_base& str);

Таким образом, он предназначен для работы исключительно с потоками.

В случае std::setprecision()Немного сложно:

/*unspecified*/ setprecision( int n );

Тем не мение:

Возвращает объект неопределенного типа, такой, что если str является именем выходного потока типа std :: basic_ostream или входного потока типа std :: basic_istream, тогда выражение str << setprecision (n) или str >> setprecision (n) ведет себя так, как будто был выполнен следующий код:

  str.precision(n);

Таким образом, это могло бы сработать, если бы std::string::precision() метод, но не один.


Какие еще способы я могу реализовать это?

Возможное решение:

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

using namespace std;

int main()
{
double a = 157.2734;
cout << "This number is " << fixed << setprecision(1) << a << "." << endl;
ostringstream fmtStr;
fmtStr << "This number is " << fixed << setprecision(1) << a << ".\n";
string line = fmtStr.str();
cout << line;
return 0;
}

Выход:

This number is 157.3.
This number is 157.3.

Демоверсия жизни на ideone

2

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

Других решений пока нет …

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