【追求進步】表示數值的字符串

題目描述

請實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
這個題目的思路就是一步一步需要都思維嚴謹的考慮周到:
1.邊界的處理
2.指針遍歷進行判斷分層:遇到+或者-指針向前移動;-->到達了字符串末尾,則肯定不是數值;例如:+
將繼續遍歷接着判斷是否有0-9的數字;-->
【如果未到字符串的末尾】-->
【如果是小數】則移動index。繼續判斷是否後面是0-9的數字;如果已經是字符串末尾則是數值;例如2.3
【如果是指數標識】-->
 判斷【是否是科學計數法的結尾部分】,如E5,e5,E+5,e-5,e(E)後面接整數
3
// 【已經到了字符串的末尾了,說明其沒有指數部分】<pre name="code" class="java" style="color: rgb(51, 51, 51);">    return true;

在線代碼:
package TestMyselfe;

public class Test54 {
	 public static boolean isNumeric(char[] str) {
		if(str==null){
			return false;
		}
		int index=0;//遍歷str的指針
		//如果開始遇到加號和減號則移動index指向的位置
		if(str[index]=='+'||str[index]=='-'){
			index++;
		}
		//已經到達字符串的末尾
		if(index >= str.length){
			return false;
		}
		boolean numeric=true;//字符串是否可以表示數值
		index=IsDigits(String.valueOf(str),index);//判斷字符串剩下的是否是0-9的數字
		// 還未到字符串的末尾
        if (index < str.length) {
            // 【如果是小數點】
            if (str[index] == '.') {
                // 移動到下一個位置
                index++;
                index = IsDigits(String.valueOf(str), index);
                // (已經到了字符串的末尾了)
                if (index >= str.length) {
                    numeric = true;
                }
                // (還未到字符串結束位置)
                else if (index < str.length && (str[index] == 'e' || str[index] == 'E')) {
                    numeric = isExponential(String.valueOf(str), index);//如果遇到科學計數法表示
                } else {
                    numeric = false;
                }
            }
            //【 如果是指數標識】
            else if (str[index] == 'e' || str[index] == 'E') {
                numeric = isExponential(String.valueOf(str), index);
            } else {
                numeric = false;
            }
            return numeric;
        }
        // 【已經到了字符串的末尾了,說明其沒有指數部分】
        else {
            return true;
        }
     }
	 //掃描字符串中的0-9的數位
	 public static int  IsDigits(String str,int index){
		 while(index < str.length()&&str.charAt(index)>='0'&&str.charAt(index)<='9'){
			 index++;
		 }
		 return index;
		}
	 /**
	     * 判斷【是否是科學計數法的結尾部分】,如E5,e5,E+5,e-5,e(E)後面接整數
	     *
	     * @param string 字符串
	     * @param index  開始匹配的位置
	     * @return 匹配的結果
	     */
	 public static boolean isExponential(String str,int index){
		 //邊界取捨
		 if(index>=str.length()||(str.charAt(index) != 'e' && str.charAt(index) != 'E')){
			 return false;
		 }
		 //移動到下一個要處理的階段
		 index++;
		 //到達字符串末尾就返回false
		 if(index>=str.length()){
			 return false;
		 }
		 if(str.charAt(index)=='+'||str.charAt(index)=='-'){
			 index++;
		 }
		// 到達字符串的末尾,就返回false
	     if (index >= str.length()) {
	            return false;
	     }
	     index = IsDigits(str, index);//繼續判斷是否是0-9
	     
	        // 如果已經處理到了的數字的末尾就認爲是正確的指數
	    return index >= str.length();
	 }
	 public static void main(String[] args) {
	      System.out.println(isNumeric("1.2.e1".toCharArray()));
	    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章