1. 程式人生 > >表示數值的字串

表示數值的字串

這裡寫圖片描述 需要格外注意的一點是e如果存在,則前面至少有一個數字存在!!!

具體程式碼如下:

package com.zhumq.leetcode;
import java.util.Scanner;
import org.junit.Test;
public class StringIsNumeric {
    /**
     *  解法1:根據字串中每個字元進行判斷分析
     */
    public boolean stringIsNumeric1(String s) {
        char[] str = s.toCharArray();
        //標記符號、小數點、e是否出現過
boolean sign=false,decimal = false,hasE = false,hasNum = false; for(int i = 0;i<str.length;i++) { //判斷e前面是否有數字出現 if(str[i]>='0'&& str[i]<='9') { hasNum = true; } /* * 1. 判斷'e'和'E' */
//e後面一定要接數字 if(str[i] == 'e' || str[i] == 'E') { if(!hasNum || i == str.length -1) return false;//e後面一定要有數字 if(hasE) return false;//e只能存在一個 hasE = true; /* * 2. 判斷'+'和'-' */ }else if(str[i] == '+'
|| str[i] == '-') { //第二次出現+或-時,必須是緊跟在e後面 if(sign&&str[i-1] != 'e' &&str[i-1]!='E') return false; //第一次出現+或-時,如果不是在字串開頭則一定要在e後面 if (!sign && i > 0 && str[i - 1] != 'e' && str[i - 1] != 'E') return false; sign = true; /* * 3. 判斷'.' */ }else if(str[i] == '.') { //e後面不能有小數點 //小數點不能出現兩次,當hasE=false時判斷deciaml,如果前面已經有小數點即decimal=true則返回false if(hasE || decimal) return false; decimal = true; /* * 4. 判斷是否為數字 */ }else if(str[i]<'0'||str[i]>'9') { return false; } } return true; } /** * 解法2:利用系統自身的校驗系統 * @param s * @return */ public boolean stringIsNumeric2(String s) { //轉換出現異常時返回false try { double number = Double.parseDouble(s); System.out.println(number); }catch(NumberFormatException e) { return false; } return true; } /** * 解法3:根據正則表示式匹配來確定是否符合!!! * [\\+\\-]? 正或負符號出現與否 * \\d+ 整數部分是否出現,如-.34 或 +3.34均符合 * (\\.\\d+)? 如果出現小數點,那麼小數點後面必須有數字;否則一起不出現 * ([eE][\\+\\-]?\\d+)? 如果存在指數部分,那麼e或E肯定出現,+或-可以不出現,緊接著必須跟著整數或者整個部分都不出現 */ public boolean stringIsNumeric3(String s) { return s.matches("[\\+\\-]?\\d+(\\.\\d+)?([eE][\\+\\-]?\\d+)?"); } @Test public void test1() { Scanner sc = new Scanner(System.in); while(sc.hasNext()) { String s = sc.next(); System.out.println(stringIsNumeric1(s)); } sc.close(); } }