从带有文本的字符串中提取双精度类型

Extracting a double from a string with text

本文关键字:提取 双精度 类型 字符串 文本      更新时间:2023-10-16

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

您可以使用sscanf函数的"poor man's regex"跳过第一位数字之前的字符,然后读取双精度,如下所示:

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

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

使用正则表达式

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

应该匹配那些有$符号和没有$符号的。

提振。Regex是一个非常好的正则表达式库

就我个人而言,我发现Boost。表现力好得多。它是一个头文件库,它有一些很好的特性,比如静态正则表达式(在编译时编译的正则表达式)。

如果您使用的是c++ 11兼容的编译器,请使用std::regex,除非您有很好的理由使用其他东西。

纯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加上适当的格式在这里也足够了:)