描述
请实现一个函数用来判断字符串str是否表示数值(包括科学计数法的数字,小数和整数)。
科学计数法的数字(按顺序)可以分成以下几个部分:
1.若干空格
2.一个整数或者小数
3.(可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个整数(可正可负)
4.若干空格
小数(按顺序)可以分成以下几个部分:
1.若干空格
2.(可选)一个符号字符(‘+’ 或 ‘-’)
3. 可能是以下描述格式之一:
3.1 至少一位数字,后面跟着一个点 ‘.’
3.2 至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
3.3 一个点 ‘.’ ,后面跟着至少一位数字
4.若干空格
整数(按顺序)可以分成以下几个部分:
1.若干空格
2.(可选)一个符号字符(‘+’ 或 ‘-’)
3. 至少一位数字
4.若干空格
bool isZheng(string str) {
if (str.empty())return false;
int i = 0;
for (; i < str.size(); i++) {
if (str[i] == ' ')continue;
else break;
}
int j = str.size() - 1;
for (; j >= 0; j--) {
if (str[j] == ' ')continue;
else break;
}
str = str.substr(i, j - i + 1);
i = 0;
if (str[i] == '+' || str[i] == '-')i++;
if (str[i] == '0' && i != (str.size() - 1) || str.size() == i)return false;
for (; i < str.size(); i++) {
if (str[i] > '9' || str[i] < '0')return false;
}
return true;
}
bool isXiao(string str) {
if (str.empty())return false;
int i = 0;
for (; i < str.size(); i++) {
if (str[i] == ' ')continue;
else break;
}
int j = str.size() - 1;
for (; j >= 0; j--) {
if (str[j] == ' ')continue;
else break;
}
str = str.substr(i, j - i + 1);
i = 0;
auto pos = find(begin(str), end(str), '.');
if (pos == str.end())return false;
string zheng = str.substr(i, pos - begin(str));
int len = zheng.size();
string xiao = str.substr(len + 1, end(str) - pos);
if (!isZheng(zheng)) {
if (zheng.size() > 1)return false;
if (zheng.size() == 1) {
if (zheng != "+" && zheng != "-")return false;
if (xiao.empty())return false;
}
}
if (zheng.empty() && xiao.empty())return false;
for (int i = 0; i < xiao.size(); i++) {
if (xiao[i] > '9' || xiao[i] < '0')return false;
}
return true;
}
bool isKe(string str) {
int i = 0;
for (; i < str.size(); i++) {
if (str[i] == ' ')continue;
else break;
}
int j = str.size() - 1;
for (; j >= 0; j--) {
if (str[j] == ' ')continue;
else break;
}
str = str.substr(i, j - i + 1);
auto pos = find(begin(str), end(str), 'e');
if (pos == end(str)) {
pos = find(begin(str), end(str), 'E');
}
if (pos == end(str)) {
if (isZheng(str) || isXiao(str))return true;
else return false;
}
string zheng = str.substr(0, pos - begin(str));
int len = zheng.size();
string xiao = str.substr(len + 1, end(str) - pos);
if (!isZheng(zheng) && !isXiao(zheng))return false;
if (!isZheng(xiao) || zheng.empty() || xiao.empty())return false;
return true;
}
bool isNumeric(string str) {
// write code here
if (isZheng(str))return true;
if (isXiao(str))return true;
if (isKe(str))return true;
return false;
}
int main() {
string s;
cin >> s;
cout << isNumeric(s);
return 0;
}