表示数值的字符串(Java)
题目:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。
但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
思考:
1、使用正则表达式
2、遍历字符串,逐个情况判断
代码:
package com.codinginterviews.str;
/**
* 题目:
* 表示数值的字符串 -- newcoder 剑指Offer 53
*
* 题目描述:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。
但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
*/
public class IsNumeric {
/**
* 思路:
* 1、使用正则表达式
*/
public boolean isNumeric(char[] str) {
if (str == null || str.length <= 0) {
return false;
}
return new String(str).matches("[+-]?[0-9]*(\\.[0-9]*)?([eE][+-]?[0-9]+)?");
}
/**
* 思路:
* 1、遍历字符串,逐个情况判断
*/
public boolean isNumericII(char[] str) {
if (str == null || str.length <= 0) {
return false;
}
// 标记符号、小数点、e是否出现过
boolean symbol = false, decimal = false, hasE = false;
int len = str.length;
for (int i = 0; i < len; i++) {
if (str[i] == 'e' || str[i] == 'E') {
if (i == len-1) {
return false; // e后面一定要接数字
}
if (hasE) {
return false; // 不能同时存在两个e
}
hasE = true;
} else if (str[i] == '+' || str[i] == '-') {
// 第二次出现+-符号,则必须紧接在e之后
if (symbol && str[i-1] != 'e' && str[i-1] != 'E') {
return false;
}
// 第一次出现+-符号,且不是在字符串开头,则也必须紧接在e之后
if (!symbol && i > 0 && str[i-1] != 'e' && str[i-1] != 'E') {
return false;
}
symbol = true;
} else if (str[i] == '.') {
// e后面不能接小数点,小数点不能出现两次
if (hasE || decimal) {
return false;
}
decimal = true;
} else if (str[i] < '0' || str[i] > '9') // 不合法字符
return false;
}
return true;
}
}