【问题标题】:C++ Converting a String to DoubleC++ 将字符串转换为双精度
【发布时间】:2013-05-25 08:46:43
【问题描述】:

我整天都在努力寻找解决方案!您可能会将其标记为重新发布,但我真正在寻找的是一个不使用 boost lexical cast 的解决方案。传统的 C++ 方法会很棒。我试过这段代码,但它返回一组乱码数字和字母。

string line; 
double lineconverted;

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

我也试过这个,但它总是返回 0。

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

提前致谢:)

编辑:对于我使用的第一个解决方案(胡言乱语).. 这是一个快照

【问题讨论】:

  • “乱码数字和字母”,都在一个双变量中?怎么样?
  • line的内容是什么?
  • 双精度值“50000”
  • @MD.Unicorn 我贴了一张照片
  • 图片中的那个“乱码”不是乱码,是表示一个很小的数字的一种方式:en.wikipedia.org/wiki/Scientific_notation#E_notation当然不是你真正想要的数字。

标签: c++ string class double


【解决方案1】:
#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;
}

好消息是,此解决方案也适用于其他解决方案,例如 int 等。

如果你想重复使用同一个缓冲区,你必须在两者之间做ss.clear

还有一个更短的解决方案,您可以将值初始化为字符串流并同时将其刷新为双精度:

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

【讨论】:

    【解决方案2】:

    从 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 吗?
    • 我是 C++ 新手,请赐教'如何' :)
    • @PJ_Boy:你在使用 MSVS 吗?什么版本?
    • @PJ_Boy,很好。阅读this,它可以帮助你。
    • 使用 gcc 编译器的尝试获取它的版本 -- 并搜索它是否支持 C++11 (c++0x)。
    【解决方案3】:

    如果您想存储(例如存储到向量)一行的所有双精度数

    #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"));
    
    }
    

    【讨论】:

      猜你喜欢
      • 2013-10-10
      • 2015-04-10
      • 2014-01-01
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      相关资源
      最近更新 更多