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