请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串"+100"
,"5e2"
,"-123"
,"3.1416"
和"-1E-16"
都表示数值。
但是"12e"
,"1a3.14"
,"1.2.3"
,"+-5"
和"12e+4.3"
都不是。
注意 :
- 小数可以没有整数部分,例如.123等于0.123;
- 小数点后面可以没有数字,例如233.等于233.0;
- 小数点前面和后面可以有数字,例如233.666;
- 当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;
- 当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4;
样例:
输入: "0"
输出: true
class Solution
{
public:
bool isNumber(string s)
{
int i = 0, j = s.size() - 1;
while (i <= j && s[i] == ' ')
i++;
while (j < i && s[j] == ' ')
j++;
// 如果为空串
if (i > j)
return false;
s = s.substr(i, j - i + 1);
//判断数字开头 + -
// substr 第二个参数为长度,为空,则一起拷贝到字符串末尾
if (s[0] == '+' || s[0] == '-')
s = s.substr(1);
// - + -. +.
if (s.empty() || s[0] == '.' && s.size() == 1)
return false;
int dot = 0, e = 0;
for (int i = 0; i < s.size(); i++)
{
// 数字字符越过
if (s[i] >= '0' && s[i] <= '9')
;
else if (s[i] == '.')
{
dot++;
// e. e12. 123.123.123
if (dot > 1 || e)
return false;
}
else if (s[i] == 'E' || s[i] == 'e')
{
e++;
// e后面没有数字 只有 123e 123e23e
// 注意 .e1 此种情况
if (i + 1 == s.size() || !i || e > 1 || i == 1 && s[0] == '.')
return false;
// 123e+ 123e-
if (s[i + 1] == '+' || s[i + 1] == '-')
{
if (i + 2 == s.size())
return false;
i++; //+ - 号过滤掉,重新循环
}
}
else
// 对于其它非目标元素 +-5, 去掉+后的-5
return false;
}
return true;
}
};
暂无评论
欢迎加入 Typecho 大家族