将字符串转换为双精度浮点数的C++方法

5

我一整天都在寻找解决方案!你可能会把这个标记为重新发布,但我真正想要的是一个不使用boost lexical cast的解决方案。用传统的C++方法来做就好了。我尝试了这段代码,但它返回了一堆无意义的数字和字母。

string line; 
double lineconverted;

istringstream buffer(line);
lineconverted;
buffer >> lineconverted;

我也尝试过这个方法,但总是返回0。

stringstream convert(line);
if ( !(convert >> lineconverted) ) {
    lineconverted  = 0;
}

感谢您提前的帮助 :)
编辑:对于我使用的第一种解决方案(胡言乱语)…这是一个快照 “在此输入图像描述”src

可能是重复的问题:如何在C++中将字符串转换为双精度浮点数? - jogojapan
关于你的代码:你意识到 string line 是默认初始化的,所以它是空的吗? - jogojapan
我也尝试了atof,但仍然没有返回双精度值50000,它显示为“0”,即使我使用了atof。 - PewK
3
图片中的“胡言乱语”并不是胡言乱语,它是表示一个非常小的数字的方法:http://en.wikipedia.org/wiki/Scientific_notation#E_notation 当然,那不是你实际想要的数字。 - BoBTFish
你确定传递给 istringstream 的字符串不为空吗?如果你现在得到的极小值不是你期望的值,原因很可能是你传递的字符串为空,这种情况下 double 不会被改变,而且由于你没有初始化它,它将具有不可预测的值。 - jogojapan
显示剩余8条评论
3个回答

13
#include <sstream>

int main(int argc, char *argv[])
{
    double f = 0.0;

    std::stringstream ss;
    std::string s = "3.1415";

    ss << s;
    ss >> f;

    cout << f;
}

好的是,这个解决方案也适用于其他类型,比如整型等。

如果你想重复使用相同的缓冲区,在其中间必须做ss.clear

还有一个更简短的解决方案可用,你可以将值初始化为stringstream并同时将其刷新为double:

#include <sstream>
int main(int argc, char *argv[]){
   stringstream("3.1415")>>f ;
}

7

自 C++11 开始,您可以使用 std::stod 函数:

string line; 
double lineconverted;

try
{
    lineconverted = std::stod(line);
}
catch(std::invalid_argument)
{
    // can't convert
}

但是使用 std::stringstream 的解决方案也是正确的:

#include <sstream>
#include <string>
#include <iostream>

int main()
{
    std::string str;
    std::cin >> str;
    std::istringstream iss(str);
    double d = 0;
    iss >> d;
    std::cout << d << std::endl;
    return 0;
}

你确定你已经启用了C++11吗? - awesoon
我是C++的新手,请指教“如何做” :) - PewK
@PJ_Boy:你在使用微软视觉工作室吗?是哪个版本? - awesoon
@PJ_Boy,不错。阅读这篇文章,它可能会对你有帮助。 - awesoon
使用gcc编译器尝试获取其版本,并查看是否支持C++11(c++0x)。 - Ed Abucay
显示剩余2条评论

0
如果你想把一行中的所有双精度数(例如到一个向量)存储起来。
#include <iostream>
#include <vector>
#include <iterator>

int main()
{

  std::istream_iterator<double> in(std::cin);
  std::istream_iterator<double> eof;
  std::vector<double> m(in,eof);

  //print
  std::copy(m.begin(),m.end(),std::ostream_iterator<double>(std::cout,"\n"));

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接