我需要将双精度字存储为字符串。我知道可以printf
显示它,但我只想将其存储在字符串变量中,以便以后可以将其存储在地图中(作为value,而不是key)。
我需要将双精度字存储为字符串。我知道可以printf
显示它,但我只想将其存储在字符串变量中,以便以后可以将其存储在地图中(作为value,而不是key)。
Answers:
该升压(TM)方式:
std::string str = boost::lexical_cast<std::string>(dbl);
在标准C ++方式:
std::ostringstream strs;
strs << dbl;
std::string str = strs.str();
注意:别忘了#include <sstream>
#include <sstream>
使用c ++方式:)
#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);
operator <<
返回std::ostream&
而不是stringstream&
。
to_string
函数。我正在使用Microsoft Visual C ++2013。–
的 标准C ++ 11的方式(如果你不关心输出格式):
#include <string>
auto str = std::to_string(42.5);
to_string
是一个新的库函数中介绍N1803(R0),N1982(r1)和N2408(r2)“ 简单数字访问 ”中。还有stod
执行反向操作的功能。
如果您确实要使用不同于的输出格式"%f"
,请使用snprintf
或ostringstream
其他答案中说明方法。
8.0
它会给我字符串"8.000000"
,而"8"
这会很好。
1e-9
产生0.000000
如果使用C ++,请避免使用sprintf
。它不是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);
您可以在C ++ 11中使用std :: to_string
double d = 3.0;
std::string str = std::to_string(d);
std::to_string()
仅返回了0.000000,而不是科学形式。
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 ++ String Toolkit Libary。刚刚在其他地方发布了类似的答案。我发现它非常快速可靠。
#include <strtk.hpp>
double pi = M_PI;
std::string pi_as_string = strtk::type_to_string<double>( pi );
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 */
您可能需要阅读我之前关于SO的帖子。(带有临时ostringstream对象的宏版本。)
记录一下:在我自己的代码中,我更喜欢snprintf()。在本地堆栈上有一个char数组,效率不是那么低。(好吧,如果您超出了数组大小并循环执行两次...)
(我也通过vsnprintf()对其进行了包装。但是,这使我花了一些类型检查。
sprintf()
和家人一起看看。
通常,对于此操作,您必须使用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");