题意:
给定一个字符串,判断它是不是一个数字。
思路:
首先要把字符串头尾的空格去掉。
接着可以分2种数字表示方法讨论,1.普通写法 2.科学计数法。
普通写法判断依据为,一定要有数字出现,一定没有0123456789+-.之外的字符出现,对于+-只能出现在第一位或者不出现,对于.如果是浮点数的话只能出现一次。
注意.3表示0.3,3.表示3.0,都是合法的,但是.不能表示0.0,所以不合法。
科学计数法判断依据为,从e处分割判断,前面是一个普通写法的浮点数或整数,后面是一个普通写法的整数。
代码:
class Solution {
public:
bool isNumber(string s) {
s.erase(0, s.find_first_not_of(" "));
s.erase(s.find_last_not_of(" ") + 1);
int pos = s.find("e");
if (pos == -1) {
return isFloat(s);
}
return isFloat(s.substr(0, pos)) && isInt(s.substr(pos + 1));
}
private:
bool isFloat(string s) {
int n = s.size();
if (n == 0) {
return false;
}
bool point = false;
bool number = false;
for (int i = 0; i < n; ++i) {
if (s[i] >= '0' && s[i] <= '9') {
number = true;
} else if (s[i] == '+' || s[i] == '-') {
if (i != 0) {
return false;
}
} else if (s[i] == '.') {
if (point) {
return false;
}
point = true;
} else {
return false;
}
}
return number;
}
bool isInt(string s) {
int n = s.size();
if (n == 0) {
return false;
}
bool number = false;
for (int i = 0; i < n; ++i) {
if (s[i] >= '0' && s[i] <= '9') {
number = true;
} else if (s[i] == '+' || s[i] == '-') {
if (i != 0) {
return false;
}
} else {
return false;
}
}
return number;
}
};