一、题目
实现一个函数来判断字符串是否是数值的形式(包括小数、整数和指数等)
二、举例
正确的:"+100","5e2","-123","3.1416"及"-1E-16"
错误的:"12e","1a3.14","1.2.3","+-5"及"12e+5.4"
三、思想
(1)对所用可能出现的字符进行逐个分析
(2)如是+或者-号,可以出现在字符串的最前面,不能出现在末尾,后面必须要是数字
(3)如是.号,其不能出现在开头和结尾,其两边必须是数字,且整个字符串中最多出现一次
(4)如是E或e,不能出现在开头和结尾,其左边必须是数字,右边可以是+或-号等,依次类推
四、程序
package 剑指offer;
/*请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。*/
public class Test54 {
public static boolean stringIsNumber(String str){
/*正确的:"+100","5e2","-123","3.1416"及"-1E-16"*/
/*错误的:"12e","1a3.14","1.2.3","+-5"及"12e+5.4"*/
int nodeNum = 0;
int echarNum = 0;
//记录e和.的位置
int nodeIndex = -1;
int echarIndex = -1;
for(int i = 0; i < str.length(); i++){
// 边界情况判断
if(str == null || str.length() < 1){
return false;
}
//0.判断所有元素是否符合
if((str.charAt(i) >= '0' && str.charAt(i) <= '9') || str.charAt(i) == 'e' ||
str.charAt(i) == 'E' || str.charAt(i) == '.' || str.charAt(i) == '-' ||
str.charAt(i) == '+'){
}else{
return false;
}
//1.判断正负号情况
if(str.charAt(i) == '+' || str.charAt(i) == '-'){
if(!confirmHaveTwo(str, i)){
return false;
}
}
//2.判断.的情况
if(str.charAt(i) == '.'){
if(!confirmNode(str, i)){
return false;
}
nodeNum++;
nodeIndex = i;
}
//3.判断e或者E的情况
if(str.charAt(i) == 'E' || str.charAt(i) == 'e'){
if(!confirmEchar(str, i)){
return false;
}
echarNum++;
echarIndex = i;
}
// 如果有两个或者两个以上的e或者E或者.就会报错
if(echarNum >= 2 || nodeNum >= 2){
return false;
}
//如果.号再e或者E的后边就会报错
if(nodeIndex > echarIndex && echarIndex != -1){
return false;
}
}
return true;
}
//判断+号或者-号后面是不是数字
public static boolean confirmHaveTwo(String str, int i){
//如果出现在字符串的开头末尾,防止空指针异常
if(i == str.length() - 1){
return false;
}
//如果符合后面是数字返回true否则返回false
if(str.charAt(i + 1) >= '0' && str.charAt(i + 1) <= '9'){
return true;
}else{
return false;
}
}
//判断.号前后是不是数字
public static boolean confirmNode(String str, int i){
//如果出现在字符串的开头末尾,防止空指针异常
if(i == str.length() - 1 || i == 0){
return false;
}
//判断符合前后是不是数字
if((str.charAt(i + 1) >= '0' && str.charAt(i + 1) <= '9') && (str.charAt(i - 1) >= '0' && str.charAt(i - 1) <= '9')){
return true;
}else{
return false;
}
}
//判断E或者e前后的数字或者符合的情况
public static boolean confirmEchar(String str, int i){
//如果出现在字符串的开头末尾,防止空指针异常
if(i == str.length() - 1 || i == 0){
return false;
}
//判断符合前后的两种情况(左右都是数字,左边数字右边符号)
if((str.charAt(i - 1) >= '0' && str.charAt(i - 1) <= '9') && (str.charAt(i + 1) >= '0' && str.charAt(i + 1) <= '9') ||
(str.charAt(i - 1) >= '0' && str.charAt(i - 1) <= '9') && (str.charAt(i + 1) == '+' || str.charAt(i + 1) == '-')){
return true;
}else{
return false;
}
}
public static void main(String args[]){
System.out.println(stringIsNumber("+100"));
System.out.println(stringIsNumber("5e2"));
System.out.println(stringIsNumber("-123"));
System.out.println(stringIsNumber("3.1416"));
System.out.println(stringIsNumber("-1E-16"));
System.out.println("==========================");
System.out.println(stringIsNumber("12e"));
System.out.println(stringIsNumber("1a3.14"));
System.out.println(stringIsNumber("1.2.3"));
System.out.println(stringIsNumber("+-5"));
System.out.println(stringIsNumber("12e+5.4"));
}
}
-------------output-------------
true
true
true
true
true
==========================
false
false
false
false
false