如何将C ++中的double转换为string?

我需要将一个double存储为一个string。 我知道如果我想显示它,我可以使用printf ,但我只是想将它存储在一个stringvariables中,以便稍后(作为而不是 )将其存储在地图中。

boost(tm)方法:

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

标准的C ++方式:

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

注意 :不要忘记#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); 

标准C ++ 11的方式(如果你不关心输出格式):

 #include <string> auto str = std::to_string(42.5); 

to_string是N1803 (r0), N1982 (r1)和N2408 (r2)“ 简单数字访问 ”中引入的新库函数。 还有stodfunction来执行反向操作。

如果您希望使用不同于"%f"输出格式,请使用其他答案中所示的snprintfostringstream方法。

如果您使用C ++,请避免使用sprintf 。 这是un-c ++ y,有几个问题。 Stringstreams是select的方法,最好封装在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); 

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

我会看看C ++string工具包Libary 。 刚在其他地方发表了类似的回答 我发现它非常快速和可靠。

 #include <strtk.hpp> double pi = M_PI; std::string pi_as_string = strtk::type_to_string<double>( pi ); 

香草萨特有一个关于string格式的优秀文章 。 我build议阅读。 我已经把它链接到了。

lexical_cast的问题是无法定义精度。 通常情况下,如果你把一个double转换成一个string,那是因为你想打印出来。 如果精度太高或太低,会影响你的输出。

你可以在C ++ 11中使用std :: to_string

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

你也可以使用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对象的macros观版本。)

logging:在我自己的代码中,我喜欢snprintf()。 在本地堆栈上有一个char数组,效率并不高。 (好吧,也许如果你超出了数组大小,并循环做两次…)

(我也通过vsnprintf()包装它,但是这花费了我一些types检查,如果你想要的代码,Yelp …)

通常这个操作你必须使用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); } 

看看sprintf()和家人。

你可以尝试一个更紧凑的风格:

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

你可以使用这个函数将任何东西转换成任何东西:

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