题目:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
思路:
- 思路一:正则表达式"[\+\-]?\d*(\.\d+)?([eE][\+\-]?\d+)?"
/**
*[\\+\\-]? -------------------->表示是否有正负号
* \\d*------------------------->表示符号后是否紧跟着整数数字
* (\\.\\d+)?------------------>表示.后面必须紧跟数字,表示小数
* ([eE][\\+\\-]?\\d+)?--------->表示出现e或者E指数形式后是否紧跟+-号,+-号后必须紧跟整数数字
*/
- 思路二,反向思维:
12e说明e的后面必须有数字,不能有两个e
+-5说明符号位要么出现一次在首位,要么出现一次在e的后一位,其他地方都不能有
12e4.3说明e的后面不能有小数,1.2.3说明不能有两个小数点
1a3.14说明不能有其他的非法字符,比如这里的a
Java
package nowcoder;
public class S53_IsNumeric {
public boolean isNumeric(char[] str){
//正则表达式
/*String string = String.valueOf(str);
return string.matches("[\\+\\-]?\\d*(\\.\\d+)?([eE][\\+\\-]?\\d+)?");*/
//常规方法
boolean signal = false;
boolean decimal = false;
boolean hasE = false;
for (int i=0;i<str.length;i++){
if (str[i] == 'e' || str[i] == 'E'){
//e后面必须有数字
if (i == str.length-1)
return false;
//不能出现两个e
if (hasE)
return false;
//e前面只能是数字
if (i == 0 || str[i-1] < '0' || str[i-1] > '9')
return false;
hasE = true;
}else if (str[i] == '+' || str[i] == '-'){
//若符号不是第一次出现,那么这个符号只能出现在e的后面
if (signal && str[i+1] != 'e'&& str[i+1] != 'E')
return false;
//第一次出现符号,判断其前是否是e
if (!signal && str[i-1] != 'e' && str[i-1] != 'E')
return false;
signal = true;
}else if (str[i] == '.'){
//若存在小数点,判断其是否出现在e后
if (hasE){
for (;i>=0;i--){
if (str[i] == 'e' ||str[i] == 'E')
return false;
}
}
if (signal)
return false;
signal = true;
}
else if (str[i] < '0' || str[i] > '9')
return false;
}
return true;
}
public static void main(String[] args){
S53_IsNumeric s53 = new S53_IsNumeric();
char[] str = {'3','.','e','4'};
System.out.println(s53.isNumeric(str));
}
}
Python
import re
class IsNumeric:
# s字符串
def isNumeric(self, s):
m = re.compile("[\+\-]?[0-9]*([\.][0-9]+)?([eE][+-]?[0-9]+)?")
if re.match(m, s).group() == s:
return True
else:
return False
if __name__ == '__main__':
test = IsNumeric()
str = '3.e4'
print(test.isNumeric(str))