class Solution {
public:
bool isNumber(string s) {
if (s.size() == 0)
{
return false;
}
int len = s.size();
int index = 0;
while(index < len && s[index] == ' ') //去空格
index++;
if (s[index] == '+' || s[index] == '-')
{
index++;
}
if (index == len)
{
return false;
}
if(s[index] == '.')
{
if(index+1 == len || s[index+1] <'0' || s[index+1] > '9')
return false;
}
else if(s[index] >'9' || s[index] < '0')
return false;
bool numeric = true;
scanDigits(s, index, len);
if (index < len)
{
//for floats
if (s[index] == '.')
{
index++;
scanDigits(s, index, len);
if (index < len && (s[index] == 'e' || s[index] == 'E') )
{
numeric = isExponential(s, index, len);
}
}
//for exponential
else if (s[index] == 'e' || s[index] == 'E')
{
numeric = isExponential(s, index, len);
}
else if(s[index] != ' ')
return false;
}
while(index < len && s[index] == ' ')
index++;
return numeric && index == len;
}
void scanDigits(const string &s, int &index, const int &len)
{
while (index < len && s[index] >= '0' && s[index] <= '9')
{
index++;
}
}
bool isExponential(const string &s, int &index, const int &len)
{
if (s[index] == 'e' || s[index] == 'E')
{
index++;
}
if (index <len &&(s[index] == '+' || s[index] == '-'))
{
index++;
}
if (index == len || s[index] == ' ')
{
return false;
}
scanDigits(s, index, len);
while(index < len && s[index] == ' ')
index++;
return index == len ? true : false;
}
};