Важно
Прочитайте примечание в конце.
Быстрый ответ:
Используйте to_string()
. (доступно начиная с c ++ 11)
пример:
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string pi = "pi is " + to_string(3.1415926);
cout<< "pi = "<< pi << endl;
return 0;
}
Запустите его самостоятельно: http://ideone.com/7ejfaU
Они также доступны:
string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);
Важное примечание:
Как справедливо заметил @Michael Konečný, использование to_string()
в лучшем случае рискованно, что может привести к неожиданным результатам.
От http://en.cppreference.com/w/cpp/string/basic_string/to_string:
С типами с плавающей запятой std::to_string
может давать неожиданные результаты , поскольку число значащих цифр в возвращаемой строке может быть равно нулю, см. Пример.
Возвращаемое значение может значительно отличаться от того, что печатает std::cout
по умолчанию, см. Пример.
std::to_string
полагается на текущую локаль для форматирования, и поэтому одновременные вызовы std::to_string
из
несколько потоков могут привести к частичной сериализации вызовов. C++17
std::to_chars
обеспечивает более высокую производительность независимо от локали
Альтернатива.
Лучшим способом было бы использовать stringstream
, как и другие, такие как @dcp, продемонстрированный в его ответе .:
Эта проблема демонстрируется в следующем примере:
запустите пример самостоятельно: https://www.jdoodle.com/embed/v0/T4k
#include <iostream>
#include <sstream>
#include <string>
template < typename Type > std::string to_str (const Type & t)
{
std::ostringstream os;
os << t;
return os.str ();
}
int main ()
{
// more info : https://en.cppreference.com/w/cpp/string/basic_string/to_string
double f = 23.43;
double f2 = 1e-9;
double f3 = 1e40;
double f4 = 1e-40;
double f5 = 123456789;
std::string f_str = std::to_string (f);
std::string f_str2 = std::to_string (f2); // Note: returns "0.000000"
std::string f_str3 = std::to_string (f3); // Note: Does not return "1e+40".
std::string f_str4 = std::to_string (f4); // Note: returns "0.000000"
std::string f_str5 = std::to_string (f5);
std::cout << "std::cout: " << f << '\n'
<< "to_string: " << f_str << '\n'
<< "ostringstream: " << to_str (f) << "\n\n"
<< "std::cout: " << f2 << '\n'
<< "to_string: " << f_str2 << '\n'
<< "ostringstream: " << to_str (f2) << "\n\n"
<< "std::cout: " << f3 << '\n'
<< "to_string: " << f_str3 << '\n'
<< "ostringstream: " << to_str (f3) << "\n\n"
<< "std::cout: " << f4 << '\n'
<< "to_string: " << f_str4 << '\n'
<< "ostringstream: " << to_str (f4) << "\n\n"
<< "std::cout: " << f5 << '\n'
<< "to_string: " << f_str5 << '\n'
<< "ostringstream: " << to_str (f5) << '\n';
return 0;
}
вывод:
std::cout: 23.43
to_string: 23.430000
ostringstream: 23.43
std::cout: 1e-09
to_string: 0.000000
ostringstream: 1e-09
std::cout: 1e+40
to_string: 10000000000000000303786028427003666890752.000000
ostringstream: 1e+40
std::cout: 1e-40
to_string: 0.000000
ostringstream: 1e-40
std::cout: 1.23457e+08
to_string: 123456789.000000
ostringstream: 1.23457e+08