如何在Python中将double转换为字符串?

时间:2008-12-01 20:35:29

标签: c++ string double

我需要将double存储为字符串。我知道我可以使用printf如果我想显示它,但我只想将它存储在一个字符串变量中,以便我以后可以将它存储在地图中(作为,不是)。

18 个答案:

答案 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_stringN1803(r0),N1982(r1)和N2408(r2)“简单数字访问中引入的新库函数EM>”。还有stod函数来执行反向操作。

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

答案 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)

You may want to read my prior posting on SO. (Macro'ed version with a temporary ostringstream object.)

记录:在我自己的代码中,我赞成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