doubleを文字列として格納する必要があります。printf
表示したい場合に使用できることはわかっていますが、文字列変数に格納して後でマップに(キーではなく値として)格納できるようにしたいだけです。
doubleを文字列として格納する必要があります。printf
表示したい場合に使用できることはわかっていますが、文字列変数に格納して後でマップに(キーではなく値として)格納できるようにしたいだけです。
回答:
ブースト(TM)の方法:
std::string str = boost::lexical_cast<std::string>(dbl);
標準C ++方法:
std::ostringstream strs;
strs << dbl;
std::string str = strs.str();
注:忘れないでください#include <sstream>
#include <sstream>
c ++の方法を忘れないでください:)
#include <sstream>
、「不完全な型は許可されていません」というエラーが表示されます。
// The C way:
char buffer[32];
snprintf(buffer, sizeof(buffer), "%g", myDoubleVar);
// The C++03 way:
std::ostringstream sstream;
sstream << myDoubleVar;
std::string varAsString = sstream.str();
// The C++11 way:
std::string varAsString = std::to_string(myDoubleVar);
// The boost way:
std::string varAsString = boost::lexical_cast<std::string>(myDoubleVar);
operator <<
返すため、C ++の方法は機能しません。std::ostream&
stringstream&
to_string
関数があることを知りませんでした。私は、Microsoft Visual C ++ 2013使っています
標準C ++ 11の方法(あなたは、出力形式を気にしない場合):
#include <string>
auto str = std::to_string(42.5);
to_string
N1803(r0)、N1982(r1)、N2408(r2)で導入された新しいライブラリ関数「Simple Numeric Access」。stod
逆の操作を行う機能もあります。
とは異なる出力形式にしたい場合は、他の回答に示されているようにまたはメソッドを"%f"
使用します。snprintf
ostringstream
8.0
文字列が得られますが、完全に問題"8.000000"
ありません"8"
。
1e-9
生産する0.000000
C ++を使用する場合は、を避けてくださいsprintf
。非C ++ yであり、いくつかの問題があります。文字列ストリームは選択する方法であり、Boost.LexicalCastのようにカプセル化することができ、非常に簡単に実行できます。
template <typename T>
std::string to_string(T const& value) {
stringstream sstr;
sstr << value;
return sstr.str();
}
使用法:
string s = to_string(42.5);
C ++ 11ではstd :: to_stringを使用できます
double d = 3.0;
std::string str = std::to_string(d);
std::to_string()
科学的形式ではなく単に0.000000を返しました。
sprintf
は大丈夫ですが、C ++では、変換を行うためのより良い、安全な、そして少し遅い方法でもありますstringstream
:
#include <sstream>
#include <string>
// In some function:
double d = 453.23;
std::ostringstream os;
os << d;
std::string str = os.str();
Boost.LexicalCastを使用することもできます。
#include <boost/lexical_cast.hpp>
#include <string>
// In some function:
double d = 453.23;
std::string str = boost::lexical_cast<string>(d);
どちらの場合も、後でするstr
必要があります"453.23"
。LexicalCastには、変換が確実に完了するといういくつかの利点があります。stringstream
内部でsを使用します。
C ++ String Toolkit Libaryを見てみます。同様の答えを他の場所に投稿しました。私はそれが非常に高速で信頼できることを発見しました。
#include <strtk.hpp>
double pi = M_PI;
std::string pi_as_string = strtk::type_to_string<double>( pi );
lexical_castの問題は、精度を定義できないことです。通常、doubleを文字列に変換する場合は、出力したいためです。精度が高すぎたり、低すぎたりすると、出力に影響します。
stringstreamを使用することもできます。
えっと、私はこれを書いただけです(この質問とは無関係です):
string temp = "";
stringstream outStream;
double ratio = (currentImage->width*1.0f)/currentImage->height;
outStream << " R: " << ratio;
temp = outStream.str();
/* rest of the code */
私の以前のSOへの投稿を読んでください。(一時的なostringstreamオブジェクトを含むマクロバージョン)。
記録のために:私のコードでは、snprintf()を使用しています。ローカルスタックにchar配列があるので、それほど効率的ではありません。(まあ、多分あなたが配列のサイズを超えて、それを2回行うためにループした場合...)
(vsnprintf()でラップしました。しかし、型チェックが必要です。コードが必要な場合は、Yelpを使用してください...)
sprintf()
と家族を見てみましょう。
通常、この操作では、ecvt、fcvt、またはgcvt関数を使用する必要があります。
/* gcvt example */
#include <stdio.h>
#include <stdlib.h>
main ()
{
char buffer [20];
gcvt (1365.249,6,buffer);
puts (buffer);
gcvt (1365.249,3,buffer);
puts (buffer);
return 0;
}
Output:
1365.25
1.37e+003
関数として:
void double_to_char(double f,char * buffer){
gcvt(f,10,buffer);
}
よりコンパクトなスタイルを試すことができます:
std::string number_in_string;
double number_in_double;
std::ostringstream output;
number_in_string = (dynamic_cast< std::ostringstream*>(&(output << number_in_double <<
std::endl)))->str();
を使用しto_string()
ます。
例:
#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);