web-dev-qa-db-ja.com

C ++でdoubleを文字列に変換する方法

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

157
Bill the Lizard

boost(tm)のように。

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

標準C++の方法

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

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

173
// 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);
177
Adam Rosenfield

標準C++ 11の方法(出力形式を気にしないのであれば):

#include <string>

auto str = std::to_string(42.5); 

to_stringN18 (r0)、 N1982 (r1)および N2408 (r2)で導入された新しいライブラリ関数です。 #〜msgstr "簡単な数値アクセス"#:。逆の操作を実行するためのstod関数もあります。

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

112
kennytm

C++を使用している場合は、sprintfを避けてください。 C++ではなく、いくつかの問題があります。文字列ストリームは最適な方法で、できれば 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);
24
Konrad Rudolph

C++ 11では std :: to_string を使用できます。

double d = 3.0;
std::string str = std::to_string(d);
16
Yochai Timmer

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には、変換が確実に完了するという点でいくつかの利点があります。内部的にstringstreamsを使用します。

10
coppro

C++ String Toolkit Libary を見てください。同様の答えを他の場所に投稿しただけです。私はそれが非常に速くそして信頼できると感じました。

#include <strtk.hpp>

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

Herb Sutterは優れています 文字列フォーマットに関する記事 。読むことをお勧めします。私は その前にそれをリンクしました SOです。

7
Fred Larson

Lexical_castの問題は精度を定義できないことです。通常、doubleを文字列に変換しているのであれば、それを印刷したいからです。精度が高すぎても小さすぎても、出力に影響します。

6
Foxhunter

stringstream を使うこともできます。

4
Firas Assaad

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

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

/* rest of the code */
4
Vinko Vrsalovic

sprintf()とfamilyを見てください。

2
Darron

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

あなたはSOに関する私の以前の投稿を読みたいかもしれません。(一時的な文字列オブジェクトを持つマクロ版)

記録のために:私自身のコードでは、snprintf()を好みます。ローカルスタック上のchar配列では、それほど効率的ではありません。 (おそらく、配列のサイズを超えて2回ループした場合は...)

(私はまたvsnprintf()でそれをラップしました。しかしそれは私にいくつかの型チェックを要します。あなたがコードを望むならYelpは...)

2
Mr.Ree

もっとコンパクトなスタイルを試すこともできます。

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

あなたはこの関数を使って何かを何かに変換することができます:

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");
0
Sam Mokari

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/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);
0
Breeze