从带有文本的字符串中提取双精度类型
Extracting a double from a string with text
我有一个包含许多不同字符的字符串,类似于:"$:" "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
加上适当的格式在这里也足够了:)
相关文章:
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 检查是否以特定精度给出双精度
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- C 字符串返回字符串的整数/双精度/长整型值
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 如何使双精度值的 C++ 和 C# 中的结果相同
- 使用浮点数和双精度数的非常小数字的数学
- 使用 Xcode 将双精度存储在数组C++中
- 使用从文件(stod、strtod、atof)中提取的数据C++从字符串转换为双精度.csv
- 将不同类型的模板参数包提取到双精度向量中会产生警告
- 如何从字符串流中提取双精度
- 从 CSV C++中提取双精度值时出现意外结果
- std::istream 提取运算符(双精度或浮点数)在 VS 2012 中非常慢
- 无法从不区分大小写的字符串中提取双精度类型
- 从带有文本的字符串中提取双精度类型
- 从字符串(如整型或双精度型)中提取数字