表示數值的字串
阿新 • • 發佈:2018-12-10
需要格外注意的一點是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();
}
}