我需要将double存储为字符串。我知道我可以使用printf
如果我想显示它,但我只想将它存储在一个字符串变量中,以便我以后可以将它存储在地图中(作为值,不是键)。
答案 0 :(得分:176)
// 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 :(得分:173)
boost(tm)方式:
std::string str = boost::lexical_cast<std::string>(dbl);
标准C ++ 方式:
std::ostringstream strs;
strs << dbl;
std::string str = strs.str();
注意:不要忘记#include <sstream>
答案 2 :(得分:112)
标准C ++ 11 方式(如果您不关心输出格式):
#include <string>
auto str = std::to_string(42.5);
to_string
是N1803(r0),N1982(r1)和N2408(r2)“简单数字访问中引入的新库函数EM>”。还有stod
函数来执行反向操作。
如果您确实希望使用与"%f"
不同的输出格式,请使用其他答案中所示的snprintf
或ostringstream
方法。
答案 3 :(得分:24)
如果您使用C ++,请避免使用sprintf
。这是un-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);
答案 4 :(得分:16)
您可以在C ++ 11中使用std::to_string
double d = 3.0;
std::string str = std::to_string(d);
答案 5 :(得分:10)
我会看C++ String Toolkit Libary。刚刚在别处发布了类似的答案。我发现它非常快速和可靠。
#include <strtk.hpp>
double pi = M_PI;
std::string pi_as_string = strtk::type_to_string<double>( pi );
答案 6 :(得分:10)
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
。
答案 7 :(得分:7)
Herb Sutter有一个很棒的article on string formatting。我建议阅读它。我{是} linked it before。
答案 8 :(得分:6)
lexical_cast的问题是无法定义精度。通常,如果要将double转换为字符串,那是因为您要将其打印出来。如果精度过高或过低,都会影响输出。
答案 9 :(得分:4)
您也可以使用stringstream。
答案 10 :(得分:4)
string temp = "";
stringstream outStream;
double ratio = (currentImage->width*1.0f)/currentImage->height;
outStream << " R: " << ratio;
temp = outStream.str();
/* rest of the code */
答案 11 :(得分:2)
记录:在我自己的代码中,我赞成snprintf()。使用本地堆栈上的char数组,效率并不高。 (好吧,也许如果你超过了数组大小并循环执行两次......)
(我也通过vsnprintf()包装它。但是这需要我进行一些类型检查。如果你想要代码那么Yelp ...)
答案 12 :(得分:2)
Normaly对于此操作,您必须使用ecvt,fcvt或gcvt函数:
0, 1, 2, 0
作为一个功能:
install.packages("RSQLite")
library(RSQLite)
# Connect
db = dbConnect(SQLite(), "~/Desktop/test.sqlite")
# Make a table
dbSendQuery(db, "
CREATE TABLE data
(Year INT,
Station TXT,
Obs TXT)
")
# Generate dummy data
x = data.frame(Year=rep(1995:2004, 100),
Station=rep(c("Bob", "Ringo", "Jarrett", "Heron"), 250),
Obs=rep(c(0:3, "n"), 200))
# Write dummy data to db
dbWriteTable(db, "data", x, append=T, row.names=F)
# Get summary of data back
y = dbGetQuery(db, "
SELECT Year, Station, Obs, COUNT(Obs) AS num FROM data
GROUP BY Year, Station, Obs
")
答案 13 :(得分:2)
看看sprintf()
和家人。
答案 14 :(得分: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();
答案 15 :(得分: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);
答案 16 :(得分: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");
答案 17 :(得分:0)
请注意,字符串只是 double 的表示形式,将其转换回 double 可能不会产生相同的值。 另请注意,默认字符串转换可能会将转换修剪为特定精度。 在标准的C++方式中,可以如下控制精度:
#include <sstream>
#include <math.h>
#include <iostream>
#include <iomanip>
int main()
{
std::ostringstream sout;
sout << M_PI << '\n';
sout << std::setprecision(99) << M_PI << '\n';
sout << std::setprecision(3) << M_PI << '\n';
sout << std::fixed; //now the setprecision() value will look at the decimal part only.
sout << std::setprecision(3) << M_PI << '\n';
std::cout << sout.str();
}
这会给你输出
3.14159
3.141592653589793115997963468544185161590576171875
3.14
3.142