Skip to main content

20 表示数值的字符串

牛客

描述
请实现一个函数用来判断字符串str是否表示数值(包括科学计数法的数字,小数和整数)。

科学计数法的数字(按顺序)可以分成以下几个部分:

  1. 若干空格
  2. 一个整数或者小数
  3. (可选)一个 'e' 或 'E' ,后面跟着一个整数(可正可负)
  4. 若干空格

小数(按顺序)可以分成以下几个部分:

  1. 若干空格
  2. (可选)一个符号字符('+' 或 '-')
  3. 可能是以下描述格式之一:
    3.1 至少一位数字,后面跟着一个点 '.'
    3.2 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
    3.3 一个点 '.' ,后面跟着至少一位数字
  4. 若干空格

整数(按顺序)可以分成以下几个部分:

  1. 若干空格
  2. (可选)一个符号字符('+' 或 '-')
  3. 至少一位数字
  4. 若干空格

例如,字符串["+100","5e2","-123","3.1416","-1E-16"]都表示数值。
但是["12e","1a3.14","1.2.3","+-5","12e+4.3"]都不是数值。

//光标
int i;

public boolean isNumeric (String str) {
if(str==null) return false;
char[] arr = str.trim().toCharArray();
i=0;
boolean numeric = scanInteger(arr);

if(i<arr.length && arr[i]=='.'){
++i;
//判断小数点后面是不是无符号整数
//小数点前是一个数,或者小数点后是无符号整数,满足其一即可
//scanUnsignedInteger 放在前面是因为必须走这一步,移动光标
numeric = scanUnsignedInteger(arr) || numeric;
}

if(i<arr.length && (arr[i]=='e' || arr[i]=='E')){
++i;
// e 前面是数, e 后面是整数
numeric = numeric && scanInteger(arr);
}
//匹配无问题且匹配到结尾
return numeric && arr.length==i;
}

//移动指针,并判断是否是整数
private boolean scanInteger(char[] arr){
if(i<arr.length && ('+'==arr[i] || '-'==arr[i])) i++;
return scanUnsignedInteger(arr);
}

//移动指针,并判断是否是无符号整数
private boolean scanUnsignedInteger(char[] arr){
int before = i;
while(i<arr.length && arr[i]>='0' && arr[i]<='9'){
++i;
}
return i>before;
}