字符串处理:从一大串字符中找出数字

字符串处理,找出数字
89aaaa67-09.09900 <变为>89 67 -9.099
#pragma once

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<sstream>
using namespace std;

class findNum
{
    
    
public:
	findNum(){
    
    }
	findNum(string str) {
    
    
		init(str);
		istringstream ss(str);
		
		string stemp;
		while (ss >> stemp) {
    
    
			del0(stemp);
			//cout << stemp << endl;
			m_strs.push_back(atof(stemp.c_str()));
		}

	}
	~findNum(){
    
    }

	void init(string &str) {
    
    
		size_t len = str.size();
		for (size_t i = 0; i < len; i++) {
    
    
			char ch = str[i];
			if (!isNum(ch)) {
    
    
				str[i] = ' ';
			}
		}
		
		for (size_t i = 0; i < len;) {
    
    
			char ch = str[i];
			if (ch == '-') {
    
    
				str.insert(i, " ");
				len++; i += 2;
			}else if (ch == '+') {
    
    
				str.insert(i, " ");
				len++; i += 2;
			}
			else i++;
		}
		
	}
	bool isNum(char c) {
    
    
		return (c <= '9' && c >= '0' || c == '.'||c=='-'||c=='+');
	}
	void del0(string& str) {
    
    
		int i = 0;
		char op = 'a';

		if (str[0] == '-' || str[0] == '+') {
    
    
			i = 1;
			op = str[0];
		}
		
		while (str[i] == '0') i++;

		//此处多余去尾部的0
		int j = str.size() - 1;
		if (hasPoint(str)) {
    
    
			while (str[j] == '0') j--;
		}
		

		if(op!='a')
		    str = op+str.substr(i, j - i + 1);
		else
			str = str.substr(i, j - i + 1);
		
	}

	bool hasPoint(const string &str) {
    
    
		return str.find('.') < str.size();
	}

	void show() {
    
    
		for (double i : m_strs) {
    
    
			cout << i << " ";
		}
		cout << endl;
	}
private:
	vector<double> m_strs;
};


void testForStoN() {
    
    
	string s = "29pp044p345-0009.9090+900-400";
	findNum test(s);
	test.show();

}


 - 从例子出发画历程图
 - 学会简单的及时检验自己的想法,在main()函数中就具体的例子进行验证自己预想的结果。
 - string c_str() 将string 转化为char*
 - atof(str.c_str())
 - insert(pos,字符串)
 - find(char)==极大值,表示没找到
 

猜你喜欢

转载自blog.csdn.net/qq_34890856/article/details/105016927