檢查給定的字串是否是有效的數字
一、簡介
在本教程中,我們將探索檢查給定字串是否為 Java 中有效數字的不同方法。我們將介紹多種技術,包括內建解析方法、正規表示式和第三方函式庫。
2. 使用Character
和循環
檢查字串是否為數字的一種直接方法是迭代字串中的每個字元並驗證每個字元是否為數字:
boolean isNumeric(String str) {
if (str == null || str.isEmpty()){
return false;
}
int decimalCount = 0;
boolean hasDigits = false;
for (char c : str.toCharArray()) {
if (c == '.') {
decimalCount++;
if (decimalCount > 1) {
return false;
}
} else if (Character.isDigit(c)) {
hasDigits = true;
} else {
return false;
}
}
return true;
}
此程式碼透過單獨檢查每個字元來驗證數字字串。如果字元是數字,則代碼繼續到下一個字元。當遇到小數點 (.) 時,它會增加decimalCount
變數以追蹤小數點的數量。
如果有多個小數點,則該方法將傳回false
,將字串標記為無效。任何非數字或非小數字符號也會傳回false
結果。
我們可以用一些測試案例來驗證該方法:
assertTrue(isNumeric("123"));
assertTrue(isNumeric("123.45"));
assertFalse(isNumeric("123a"));
assertFalse(isNumeric("123.45.67"));
assertFalse(isNumeric(""));
assertFalse(isNumeric("."));
assertFalse(isNumeric(null));
此方法只處理基本十進位數(例如123.45
),無法處理科學記數法(例如1.23E3
)或負號(例如-123
)。
3.使用Integer.parseInt()
和Double.parseDouble()
常見的方法是使用Integer.parseInt()
或Double.parseDouble()
來檢查字串是否可以轉換為數字類型。如果解析成功,則該字串是一個有效的數字。但是,如果解析失敗,則會拋出NumberFormatException
,表示數字無效。
讓我們來看一個演示其用法的程式碼片段:
boolean isInteger(String str) {
if (str == null) {
return false;
}
try {
Integer.parseInt(str);
return true;
} catch (NumberFormatException e) {
return false;
}
}
boolean isDouble(String str) {
if (str == null){
return false;
}
try {
Double.parseDouble(str);
return true;
} catch (NumberFormatException e) {
return false;
}
}
讓我們用一些測試案例來驗證該方法:
assertTrue(isInteger("123"));
assertFalse(isInteger("123.45"));
assertFalse(isInteger("abc"));
assertTrue(isDouble("123.45"));
assertTrue(isDouble("123"));
assertFalse(isDouble("12a"));
如果字串不是有效數字,這兩種方法都會拋出NumberFormatException
,因此我們使用try-catch
區塊來處理此異常並傳回false
。此方法很簡單,但僅限於其範圍內的數字類型( int
和double
)。
4.使用BigDecimal
接下來,我們可以使用BigDecimal
來處理更大的數字和不同的格式,使其成為精確數位驗證的絕佳選擇。 BigDecimal
類別是 Java 的java.math
套件的一部分,旨在管理任意精確度的十進位值。它能夠解析整數、小數,甚至科學記數法中的數字。
讓我們看看如何使用BigDecimal
進行數位驗證:
boolean isBigDecimal(String str) {
if (str == null) {
return false;
}
try {
new BigDecimal(str);
return true;
} catch (NumberFormatException e) {
return false;
}
}
與解析方法類似,如果字串無法解析為有效的BigDecimal
,則會拋出NumberFormatException
來指示無效數字。
讓我們用一些測試案例來驗證該方法:
assertTrue(isBigDecimal("123.45"));
assertTrue(isBigDecimal("123"));
assertTrue(isBigDecimal("1.23E3"));
assertFalse(isBigDecimal("123abc"));
assertFalse(isBigDecimal(null));
由於BigDecimal
可以處理整數、小數和科學記數法,因此它非常適合精確度至關重要的金融應用程式。
5. 使用正規表示式
使用正規表示式是驗證字串是否為有效數字的另一種方法。此方法允許我們為不同類型的數字(整數、小數、正/負數)自訂模式。
讓我們寫一個可以匹配有效數字的正規表示式:
^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$
此正規表示式符合:
- 可選的前導
+
或–
符號 - 零個或多個數字
- 可選小數點
- 小數點後零個或多個數字
- 匹配科學計數法
讓我們使用正規表示式來驗證數字字串:
static final Pattern NUMBER_PATTERN = Pattern.compile("^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$");
boolean isValidNumberRegex(String str) {
return str != null && NUMBER_PATTERN.matcher(str).matches();
}
讓我們編寫一些測試案例來驗證該方法:
assertTrue(isValidNumberRegex("123"));
assertTrue(isValidNumberRegex("-123.45"));
assertTrue(isValidNumberRegex("+123.45"));
assertTrue(isValidNumberRegex("1.23E3"));
assertFalse(isValidNumberRegex("123a"));
assertFalse(isValidNumberRegex("123..45"));
這種方法很靈活,允許我們定義精確的數字格式,使其非常適合正/負數或小數等特定要求。然而,創建複雜的模式(例如貨幣格式或指數數字)可能會增加複雜性和維護要求。
6. 使用 Apache Commons NumberUtils
Apache Commons NumberUtils
是一個強大的函式庫,提供了一套用於處理數字的實用方法。其關鍵功能之一是驗證給定字串是否代表數字。
要使用此方法,我們需要將Apache Commons Lang庫新增到我們的專案中:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.17.0</version>
</dependency>
然後,我們可以使用NumberUtils.isCreatable()
來確定給定的字串是否可以轉換為數字。它處理各種數字格式,包括整數、小數和科學記數法。
讓我們用一些測試案例來驗證該方法:
assertTrue(NumberUtils.isCreatable("123"));
assertTrue(NumberUtils.isCreatable("123.45"));
assertTrue(NumberUtils.isCreatable("-123.45"));
assertTrue(NumberUtils.isCreatable("1.23E3"));
assertFalse(NumberUtils.isCreatable("123a"));
assertFalse(NumberUtils.isCreatable("12.3.45"));
七、結論
在本文中,我們探討了在 Java 中驗證字串是否為數字的多種方法。我們介紹了從基本字元迭代到使用正規表示式和 Java 內建解析方法(例如Integer.parseInt()
、 Double.parseDouble()
和BigDecimal
的方法。我們也查看了 Apache Commons 中的NumberUtils.isCreatable()
方法。
像往常一樣,這裡討論的程式碼可以在 GitHub 上找到。