JAVA算法:校驗數字(Valid Number)JAVA版本

JAVA算法:校驗數字(Valid Number)JAVA版本

驗證給定的字符串是否可以解釋爲十進制數字。

例如:

"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
" -90e3   " => true
" 1e" => false
"e3" => false
" 6e-1" => true
" 99e2.5 " => false
"53.5e93" => true
" --6 " => false
"-+3" => false
"95a54e53" => false

說明: 我們有意將問題陳述地比較模糊。在實現代碼之前,你應當事先思考所有可能的情況。這裏給出一份可能存在於有效十進制數字中的字符列表:

數字 0-9
指數 - "e"
正/負號 - "+"/"-"
小數點 - "."


題目分析

題目是給定一個字符串,判斷該字符串是否表示的是一個數字。

對於給定的字符串,可以使用正則表達式進行判斷:

public boolean isNumber(String s) {
        String regex = "\\s*(\\+|-)?(\\d+|(\\d+\\.\\d*)|(\\d*\\.\\d+))(e(\\+|-)?\\d+)?\\s*";
        return s.matches(regex);
}

 兩種不同的正則表達式寫法:

 public boolean isNumber(String s) {
         return s.trim().matches("^[+-]?("
                                + "(\\d+(\\.\\d*)?(e[+-]?\\d+)?)" 
                                + "|((\\.\\d+)(e[+-]?\\d+)?))$");
 }

還有一種判斷方法是,使用Double類的parseDouble()方法進行轉換。

public boolean isNumber(String s) {
		// 處理非法長度的字符串
		if (s == null || s.length() == 0)
			return false;
		//設定返回標記,初始值爲true
		boolean flag = true;
		//去空格
		s = s.trim();
		try {
			//使用了Double類的parseDouble方法,將所給的字符串轉換爲double類型的數
			double d = Double.parseDouble(s);
			//判斷浮點數,標誌位爲 f,或者 D
			if (s.charAt(s.length() - 1) == 'f' || s.charAt(s.length() - 1) == 'D') {
				flag = false;
			}
		} catch (Exception e) {
			flag = false;
		}
		return flag;
}

但是注意:.58e1+9,這種表達方法有點異常。

boolean flag=vn.isNumber(".58e1+9");

算法設計

package com.bean.algorithm.basic;

public class ValidNumber {

	public boolean isNumber(String s) {
		if (s == null || s.length() == 0)
			return false;

		s = s.trim();
		int len = s.length();
		if (len == 0)
			return false;

		int signCount = 0;
		boolean hasE = false;
		boolean hasNum = false;
		boolean hasPoint = false;

		for (int i = 0; i < len; i++) {
			char ch = s.charAt(i);

			if (ch >= '0' && ch <= '9') {
				hasNum = true;
			} else if (ch == 'e' || ch == 'E') {
				if (hasE || !hasNum || i == len - 1)
					return false;
				hasE = true;
			} else if (ch == '.') {
				if (hasPoint || hasE)
					return false;
				// 0. is true
				if (i == len - 1 && !hasNum)
					return false;
				hasPoint = true;
			} else if (ch == '+' || ch == '-') {
				// two signs at most; should not appear in the end
				if (signCount == 2 || i == len - 1)
					return false;
				// sign appears in the middle but no E/e
				if (i > 0 && !hasE)
					return false;
				signCount++;
			} else
				return false;
		}

		return true;
	}
	
	public static void main(String[] args) {
		ValidNumber vn=new ValidNumber();
		boolean flag=vn.isNumber("2e10");
		System.out.println("Flag is: "+flag);
	}

}

程序運行結果:

Flag is: true

 

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