std::string
に入れる必要がある浮動小数点値があります。フロートから文字列に変換するにはどうすればよいですか?
float val = 2.5;
std::string my_val = val; // error here
パフォーマンスが心配でない限り、 string streams を使用してください。
std::ostringstream ss;
ss << myFloat;
std::string s(ss.str());
Boostに問題がない場合、 lexical_cast <> が便利な代替手段です。
std::string s = boost::lexical_cast<std::string>(myFloat);
効率的な代替手段は、たとえば FastFormat または単にCスタイルの関数。
C++ 11の時点で、標準C++ライブラリは、arg
に対してサポートされているさまざまなタイプの関数 std::to_string(arg)
を提供します。
ダブルだけでなく、他のタイプでも機能するテンプレートを定義できます。
template <typename T> string tostr(const T& t) {
ostringstream os;
os<<t;
return os.str();
}
その後、他のタイプに使用できます。
double x = 14.4;
int y = 21;
string sx = tostr(x);
string sy = tostr(y);
重要:
最後にメモを読んでください。
クイックアンサー: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/7ejfa
これらも利用可能です。
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);
重要な注意:
@ MichaelKonečnýが正当に指摘したように、to_string()
を使用することはせいぜい危険であり、予期しない結果を引き起こす可能性が非常に高いです。
From 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
を提供します。
最良の方法は、 彼の答え で示されている@dcpなどの他のようにstringstream
を使用することです。
この問題は、次の例で示されています。
自分でサンプルを実行します: 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
C++ 11では std :: to_string を使用できます
float val = 2.5;
std::string my_val = std::to_string(val);
標準ライブラリが提供したら、 std::to_chars
を使用します。
std::array<char, 32> buf;
auto result = std::to_chars(buf.data(), buf.data() + buf.size(), val);
if (result.ec == std::errc()) {
auto str = std::string(buf.data(), result.ptr - buf.data());
// use the string
} else {
// handle the error
}
この方法の利点は次のとおりです。
残念ながらstd::to_string
は、固定表現を使用し、小さな値をゼロに丸め、大きな値に対して長い文字列を生成するため、浮動小数点の限られたユーティリティです。
auto s1 = std::to_string(1e+40);
// s1 == 10000000000000000303786028427003666890752.000000
auto s2 = std::to_string(1e-40);
// s2 == 0.000000
C++ 20は、 P0645 標準の提案が承認されると、std::format
と同じ利点を持つ、より便利なstd::to_chars
APIを取得できます。
パフォーマンスが心配な場合は、 Boost :: lexical_cast ライブラリを確認してください。
このチュートリアル は、シンプルでありながらエレガントなソリューションを提供します。
#include <sstream>
#include <string>
#include <stdexcept>
class BadConversion : public std::runtime_error {
public:
BadConversion(std::string const& s)
: std::runtime_error(s)
{ }
};
inline std::string stringify(double x)
{
std::ostringstream o;
if (!(o << x))
throw BadConversion("stringify(double)");
return o.str();
}
...
std::string my_val = stringify(val);