#include <iostream>
#include <vector>
#include<numeric>
#include<unordered_map>
#include<string>
using namespace std;
bool isNumber(string s)
{
//先去除兩邊空白
int n = s.size();
if (n < 1) return false;
int left = 0;
int right = n-1;
while (left < n - 1 && s[left] == ' ') left++;
while (right > left && s[right] == ' ') right--;
int pre = 0;
//exp 1 e
//sign 2 正負號
//dot 3 點
//num 4 0-9數字
//出現了小數點exp,後面不能有小數點
bool afterExp = false;
//出現了小數點,不能再出現了
bool dot_once = false;
//出現了小數點,不能再出現了
bool exp_once = false;
for (int i = left; i <= right; i++)
{
//只有一位必須是數字
if (left == right && (s[i] < '0' || s[i] > '9')) return false;
//只要校驗位置,和左邊的性質(不能出現的exp num sign dot)
if (s[i] =='e')
{
if (i == right || i == left ||pre<3|| exp_once)
return false;
else
{
pre = 1;
afterExp = true;
exp_once = true;
}
}
else if(s[i] == '+' or s[i] == '-')
{
if ((i != left && pre!=1) || i == right ||pre>1)
return false;
else
{
pre = 2;
}
}
else if (s[i] == '.')
{
if (pre==3||afterExp|| dot_once)
return false;
//.e1是錯誤的,點不能兩邊都不是數字,左邊如果不是數字,右邊就一定要有數字
else if (pre!=4 && (i == right || (s[i+1] < '0'|| s[i+1] > '9')))
{
return false;
}
else
{
pre = 3;
dot_once = true;
}
}
else if (s[i]>='0'&& s[i] <='9')
{
pre = 4;
}
else return false;
}
return true;
}
#if 1
int main()
{
vector<string> vec;
vec.push_back("");//false
vec.push_back(" ");//false
vec.push_back("3.");//true
vec.push_back(".e1");//false
vec.push_back("0");//true
vec.push_back(" 0.1 ");//true
vec.push_back("abc");//false
vec.push_back("1 a");//false
vec.push_back("2e10");//true
vec.push_back(" -90e3 ");//true
vec.push_back(" 1e");//false
vec.push_back("e3");//false
vec.push_back(" 6e-1");//true
vec.push_back(" 99e2.5 ");//false
vec.push_back("53.5e93");//true
vec.push_back(" --6 ");//false
vec.push_back("-+3");//false
vec.push_back("95a54e53");//false
vec.push_back("95e54e53");//false
vec.push_back("+.8");//true
vec.push_back(" 005047e+6");//true
vec.push_back("+1.e+5");//true
vec.push_back(".1.");//false
vec.push_back("-e58"); //false
for (vector<string>::iterator ite=vec.begin();ite!=vec.end();ite++)
{
cout<<*ite<<":"<< isNumber(*ite) << endl;
}
while (1);
}
#endif