C ++でdoubleを文字列に変換するにはどうすればよいですか?


171

doubleを文字列として格納する必要があります。printf表示したい場合に使用できることはわかっていますが、文字列変数に格納して後でマップに(キーではなくとして)格納できるようにしたいだけです。


2
あなたの質問に答える質問:なぜマップに格納するために文字列にdouble値を格納するのですか?文字列化されたdoubleをキーとして使用しますか?そうでない場合は、なぜダブルをそのままにしないのですか?
Matt McClellan、

1
興味深い点。doubleをマップキーとして使用すると、常に浮動小数点値の正確な比較が行われるため、危険が伴う可能性があります。文字列表現にインデックスを付けると、問題が回避されます。
Fred Larson、

2
なぜそれを変換するのですか?それをdoubleとしてマップに格納し、変換を行わないようにします。
EvilTeach 2008

3
それはまだオブジェクトの呼び出しのように聞こえます。労働組合はうまくいくでしょう。さまざまな値を挿入し、自己検証させる各オブジェクト。
EvilTeach 2008

2
ファイルには名前と値のペアの束しかありません。オブジェクトを必要としません。
リザードに請求する

回答:


183

ブースト(TM)の方法:

std::string str = boost::lexical_cast<std::string>(dbl);

標準C ++方法:

std::ostringstream strs;
strs << dbl;
std::string str = strs.str();

:忘れないでください#include <sstream>


3
boost :: lexical_castは標準のC ++の方法であり、うまくパッケージ化されていると思います。ところで、litb、そこにはマイナーなタイプミスがあります-「boot:lexical_cast」。
Fred Larson、

2
boost :: lexical_castは、文字列ストリームコードの単なるラッパーではありません。変換ルーチンの多くはインラインで実装されています。このページの下部にあるパフォーマンス測定(boost.org/doc/libs/1_47_0/libs/conversion/lexical_cast.htm)によると、boost :: lexical_castは文字列ストリームを使用するよりも高速で、ほとんどの場合、scanf /よりも高速です。 printf
Ferruccio

1
シンプルなラッパーだと言った@Ferr?そして、リンクを提供してくれてありがとう、私は実際に多かれ少なかれ単純なラッパーだと思っていました:)
Johannes Schaub-litb

27
#include <sstream>c ++の方法を忘れないでください:)
VladL '11年

3
ドキュメンテーションのために、そうしないと#include <sstream>、「不完全な型は許可されていません」というエラーが表示されます。
Trevor Sullivan

194
// 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);

1
Cではなくをoperator <<返すため、C ++の方法は機能しません。std::ostream&stringstream&
Konrad Rudolph、

私の文字列ストリームは少し錆びているようですが、私は古いCの方法を好みます。現在修正済み(希望)。
Adam Rosenfield、

あなたのCコードは最初私を捨てました。私はまだ正しい選択肢を与えるためにあなたを賛成しました。
リザードの請求

2
Cウェイを含めるための賛成票。とてもきれいに見えます。
Nealon 2013年

11
C ++ 11の方法に賛成。私はC ++を使い始めたばかりで、to_string関数があることを知りませんでした。私は、Microsoft Visual C ++ 2013使っています
トレバー・サリバン

123

標準C ++ 11の方法(あなたは、出力形式を気にしない場合):

#include <string>

auto str = std::to_string(42.5); 

to_stringN1803(r0)、N1982(r1)、N2408(r2)で導入された新しいライブラリ関数「Simple Numeric Access」。stod逆の操作を行う機能もあります。

とは異なる出力形式にしたい場合は、他の回答に示されているようにまたはメソッドを"%f"使用します。snprintfostringstream


3
そうそう、ベイビー。TO_STRINGと11のVisual Studioでの両方の仕事をSTOD
BSalita

親愛なる赤ちゃん... to_stringはVisualStudio 2010で動作しないようです):または、私が何をしているのかわかりません(非常に可能です)
chessofnerd

1
よりモダンなので、これはもっと高いはずです!
gsamaras 14

1
この関数が必要以上の小数を追加しないようにする方法はありますか?doubleを変換すると、8.0文字列が得られますが、完全に問題"8.000000"ありません"8"
HelloGoodbye 2015

1
これは小さな数では機能しません...例:1e-9生産する0.000000
user3728501

24

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);


11

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を使用します。


10

C ++ String Toolkit Libaryを見てみます。同様の答えを他の場所に投稿しました。私はそれが非常に高速で信頼できることを発見しました。

#include <strtk.hpp>

double pi = M_PI;
std::string pi_as_string  = strtk::type_to_string<double>( pi );


6

lexical_castの問題は、精度を定義できないことです。通常、doubleを文字列に変換する場合は、出力したいためです。精度が高すぎたり、低すぎたりすると、出力に影響します。



4

えっと、私はこれを書いただけです(この質問とは無関係です):

string temp = "";
stringstream outStream;
double ratio = (currentImage->width*1.0f)/currentImage->height;
outStream << " R: " << ratio;
temp = outStream.str();

/* rest of the code */

2

私の以前のSOへの投稿を読んでください。(一時的なostringstreamオブジェクトを含むマクロバージョン)。

記録のために:私のコードでは、snprintf()を使用しています。ローカルスタックにchar配列があるので、それほど効率的ではありません。(まあ、多分あなたが配列のサイズを超えて、それを2回行うためにループした場合...)

(vsnprintf()でラップしました。しかし、型チェックが必要です。コードが必要な場合は、Yelpを使用してください...)


2

sprintf()と家族を見てみましょう。


2
私がprintfについて言及したのは、グーグル処理によって、printfを使用してdoubleから文字列に変換するという一連の記事が表示されるからです。彼らは、あなたがしていることができる唯一のことは印刷であると仮定します、それは私の場合は誤りです。
リザードに請求する

なぜ-1を投票するのですか?sprintfは良いと思います。@BilltheLizardの場合、sprintは画面ではなくchar *に何かを出力します。誰かがcメソッドにまだ多くの票を得たと答えました。
ワールドターミネーター2015年

2

通常、この操作では、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);
}

0

よりコンパクトなスタイルを試すことができます:

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(); 

0

を使用し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);

0

この関数を使用して、あらゆるものをあらゆるものに変換できます。

template<class T = std::string, class U>
T to(U a) {
    std::stringstream ss;
    T ret;
    ss << a;
    ss >> ret;
    return ret;
};

使用法 :

std::string str = to(2.5);
double d = to<double>("2.5");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.