C++ 将字符串转换为双精度
Posted
技术标签:
【中文标题】C++ 将字符串转换为双精度【英文标题】:C++ Converting a String to Double 【发布时间】: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当然不是你真正想要的数字。
【参考方案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"));
【讨论】:
以上是关于C++ 将字符串转换为双精度的主要内容,如果未能解决你的问题,请参考以下文章