如何将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)“ 简单数字访问 ”中引入的新库函数。 还有stod
function来执行反向操作。
如果您希望使用不同于"%f"
输出格式,请使用其他答案中所示的snprintf
或ostringstream
方法。
如果您使用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");