从带有文本的字符串中提取double

时间:2013-03-19 11:39:27

标签: c++ string

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

3 个答案:

答案 0 :(得分:1)

您可以使用sscanf函数的“穷人的正则表达式”跳过第一个数字之前的字符,然后读取双精度数字,如下所示:

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

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

这是demo on ideone

答案 1 :(得分:0)

使用正则表达式。

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

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

的那些匹配

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

就个人而言,我发现Boost.Xpressive可以更好地使用。它是一个只有头的库,它有一些很好的功能,比如静态正则表达式(在编译时编译的正则表达式)。

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

答案 2 :(得分: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也足够了:)