2013-03-19 83 views
1

我有一个字符串,其中包含许多不同的字符,类似于:“$:”“213.23453” 如何提取double值213.23453并将其存储在变量中,它是C++/C我不能使用lambdas。从文本字符串中提取双精度值

+0

尝试正则表达式在cpp – Prasad 2013-03-19 11:41:50

+0

['stod'](http://en.cppreference.com/w/cpp/string/basic_string/stof) – 2013-03-19 11:49:01

+0

您首先必须决定是否编写C或C++,因为这两种语言的答案是不同的。 – 2013-03-19 12:06:16

回答

1

可以使用sscanf功能的“穷人的正则表达式”跳过字符之前的第一个数字,然后读双,这样的:

char *str = "\"$: \" \"213.23453\""; 
double d; 
sscanf(str, "%*[^0-9]%lf", &d); 

注意第一百分比后面的星号格式:它指示sscanf读取字符串而不将其内容写入输出缓冲区。

这是demo on ideone

0

使用正则表达式。

[$]?[0-9]*(\.)?[0-9]?[0-9]?

这应该与那些有$符号和那些没有。

Boost.Regex是一个很好的正则表达式库

就个人而言,我觉得Boost.Xpressive好得多的工作。它是一个只有头文件的库,它有一些很好的功能,例如静态正则表达式(在编译时编译的正则表达式)。

如果您使用的是C++ 11兼容编译器,请使用std::regex,除非您有充分理由使用其他内容。

+1

但是,请注意,虽然使用GCC 4.7编译的'std :: regex'很好,但它实际上非常不正常。 – 2013-03-19 11:49:22

0

纯C++解决方案可以是手动切断的数目(由std::isdigit识别的第一数位)之前的垃圾字符,然后只是构造一个临时istringstream对象来检索double从:

std::string myStr("$:. :$$#&*$ :213.23453$:#$;"); 

// find the first digit: 
int startPos = 0; 
for (; startPos < myStr.size(); ++startPos) 
    if (std::isdigit(myStr[startPos])) break; 

// cut off the trash: 
myStr = myStr.substr(startPos, myStr.size() - startPos); 

// retrieve the value: 
double d; 
std::istringstream(myStr) >> d; 

但C-风格sscanf与指定适当的格式将在这里以及:)