请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
若干空格
一个 小数 或者 整数
(可选)一个 'e' 或 'E' ,后面跟着一个 整数
若干空格
小数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+' 或 '-')
下述格式之一:
至少一位数字,后面跟着一个点 '.'
至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
一个点 '.' ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+' 或 '-')
至少一位数字
部分数值列举如下:
["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
部分非数值列举如下:
["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]

- 若干空格
- 一个 小数 或者 整数
- (可选)一个
'e'或'E',后面跟着一个 整数- 若干空格
小数:
(可选)一个符号字符('+' 或 '-')
下述格式之一:
至少一位数字,后面跟着一个点 '.'
至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
一个点 '.' ,后面跟着至少一位数字整数:
(可选)一个符号字符(
'+'或'-')至少一位数字
分析:
①数值,首尾若干空格,那就先去掉空格
②数值,包括小数,整数。
③小数,小数只有一个点,这个点前面有数字,或者点后面有数字
④
'e'或'E',后面跟着一个 整数⑤ ' + ',' - ',不能挨着,只是符号
总结:
① 对每一个字符进行判断,按情况来
②是数值
③是小数点
④e E的判断
- class Solution {
- public boolean isNumber(String s) {
- if(s == null || s.length() == 0){
- return false;
- }
- // 遍历每一个字符,对当前字符进行判断,以及前一个字符以及后一个字符
- boolean isNum = false,isDot = false,ise_or_E = false;
- char[] str = s.trim().toCharArray();
- for(int i = 0;i < str.length;i++){
- //判断当前是否是0-9的数位
- if(str[i] >= '0' && str[i] <= '9'){
- // 是数值
- isNum = true;
- }else if(str[i] == '.'){
- // 如果之前有小数点了,或者E,e,那么返回false
- if(isDot || ise_or_E){
- return false;
- }
- // 设置状态
- isDot = true;
-
- }else if(str[i] == 'e' || str[i] == 'E'){
- if(!isNum || ise_or_E){
- return false;
- }
- ise_or_E = true;
- isNum = false;
- }else if(str[i] == '-' || str[i] == '+'){
- // 看E,e的情况。
- if(i!=0 && str[i - 1] != 'e' && str[i - 1] != 'E'){
- return false;
- }
- }else {
- return false;
- }
- }
- return isNum;
- }
- }