题
我需要储存一个双作为一串。我知道我可以使用 printf
如果我想显示这一点,但我只想它存储在一个串的变量,这样我可以储存在地图后(作为 值, 不该 关键).
解决方案
在升压(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 ++,避免sprintf
。这是联合国-C ++ y和有几个问题。 Stringstreams是选择的方法中,优选包封如 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);
可以使用的的std :: to_string 强> 一>在C ++ 11
double d = 3.0;
std::string str = std::to_string(d);
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 ++工具包串 Libary。刚刚发布了类似的回答别处。我发现它非常快速和可靠的。
#include <strtk.hpp>
double pi = M_PI;
std::string pi_as_string = strtk::type_to_string<double>( pi );
香草萨特具有优异制品。我建议你阅读它。我已经 SO 的上之前链接它。
用的lexical_cast的问题是无法以限定精度。一般来说,如果你正在转换双为字符串,那是因为你想打印出来。如果精度是过多或过少,会影响到您的输出。
您也可以使用 stringstream的。
嘿,我刚写这个(无关这个问题):
string temp = "";
stringstream outStream;
double ratio = (currentImage->width*1.0f)/currentImage->height;
outStream << " R: " << ratio;
temp = outStream.str();
/* rest of the code */
您可能需要阅读,所以我之前发布。 (Macro'ed版本与临时ostringstream对象。)
有关记录:在我自己的代码,我喜欢的snprintf()。随着本地堆栈上的字符数组,它不是效率低下。 (好吧,也许如果你超出数组的大小和循环做两次......)
(我也通过vsnprintf()包装它。但是,这花了我一些类型检查。Yelp的,如果你想要的代码...)
看看sprintf()
和家人。
Normaly此操作必须使用的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);
您可以使用此功能的任何东西转换成什么:
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");