在 Java 開發中,JDK 原生的數字處理 API 不僅繁瑣,還充滿了 “陷阱”:Integer.parseInt()會拋出NumberFormatException,比較兩個數字是否相等要手動處理 null,判斷字符串是否為有效數字需要寫復雜的正則…… 這些你在開發的時候是不是感覺特別繁瑣?心想為什么就不能有一個工具類來代替做這些呢?那么它來了! 
Apache Commons Lang3 包中的 NumberUtils 用一行代碼就能解決這些問題。這個被無數項目奉為 “數字處理神器” 的工具類,到底有哪些過人之處?今天我們就來系統解鎖它的功能,看看它如何讓數字處理代碼變得簡潔而可靠。 一、原生數字處理的 “痛點清單” 先看一個常見場景:將前端傳入的字符串參數轉換為整數,若轉換失敗則使用默認值 0。用 JDK 原生方法實現需要這樣寫: // 原生方法:字符串轉整數(帶默認值) public static int parseInteger(String str) { if (str == null || str.trim().isEmpty()) { return 0; } try { return Integer.parseInt(str.trim()); } catch (NumberFormatException e) { return 0; } }
這段代碼用了 8 行才實現一個簡單的轉換功能,其中: - 3、若需要支持 Long、Double 等類型,還要重復編寫類似邏輯
而用 NumberUtils 實現同樣的功能,只需一行代碼: // NumberUtils:一行代碼完成轉換 int num = NumberUtils.toInt(str, 0);
二、NumberUtils 核心功能:數字處理的 “全能工具箱” NumberUtils 包含 30 多個靜態方法,覆蓋了數字處理的全場景需求,按功能可分為五大類: 1. 安全的類型轉換 這是 NumberUtils 最常用的功能,支持將字符串轉換為各種基本數字類型,并提供默認值機制: (1)轉整數類型 // 字符串轉int,默認值0 int a = NumberUtils.toInt("123"); // 123 int b = NumberUtils.toInt("abc", 0); // 0(轉換失敗用默認值) int c = NumberUtils.toInt(null, -1); // -1(null值用默認值) // 字符串轉long,默認值-1 long d = NumberUtils.toLong("123456789", -1); // 123456789
(2)轉浮點數類型 // 字符串轉double,默認值0.0 double e = NumberUtils.toDouble("3.14"); // 3.14 double f = NumberUtils.toDouble("not-a-number", 0.0); // 0.0 // 字符串轉float,默認值0f float g = NumberUtils.toFloat("1.68f", 0f); // 1.68f
優勢: - 轉換失敗時返回指定默認值,無需 try-catch
- 支持所有基本數字類型(int/long/float/double 等)
2. 數字有效性校驗 判斷一個字符串是否為有效的數字,避免在轉換前手動編寫正則: // 判斷是否為整數(正負整數、0) boolean isInt = NumberUtils.isDigits("123"); // true boolean isNotInt = NumberUtils.isDigits("123.45"); // false(包含小數點) // 判斷是否為有效數字(支持整數、小數、科學計數法) boolean isNumber = NumberUtils.isNumber("123.45"); // true boolean isSciNumber = NumberUtils.isNumber("1e3"); // true(科學計數法1000) boolean isNotNumber = NumberUtils.isNumber("12a3"); // false
適用場景: 3. 數字比較與最值計算 簡化多個數字的比較操作,無需手動寫 if-else: (1)大小比較 // 比較兩個int的大小,返回較大值 int maxInt = NumberUtils.max(10, 20); // 20 // 比較兩個long的大小,返回較小值 long minLong = NumberUtils.min(100L, 50L); // 50L
(2)數組最值 // 求int數組的最大值 int[] intArray = {1, 3, 5, 2, 4}; int maxInArray = NumberUtils.max(intArray); // 5 // 求long數組的最小值 long[] longArray = {10L, 5L, 8L}; long minInArray = NumberUtils.min(longArray); // 5L
優勢: - 覆蓋 int、long、float、double 等類型
4. 數字字符串操作 針對數字型字符串的特殊處理,如提取數字、拼接數字等: // 提取字符串中的所有數字,組成新字符串 String digits = NumberUtils.extractDigits("abc123def456"); // "123456" // 檢查字符串是否只包含數字字符 boolean hasOnlyDigits = NumberUtils.isDigits("12345"); // true // 生成指定范圍的隨機數(整數) int random = NumberUtils.random(1, 10); // 生成1-10之間的隨機整數
適用場景: - 從混合字符串中提取數字(如從 “訂單號:ORD12345” 提取 “12345”)
- 生成驗證碼或隨機數(替代手寫 Random 邏輯)
- 驗證用戶輸入是否為純數字(如手機號、身份證號中的數字部分)
5. 進階類型轉換 處理更復雜的數字轉換場景,如嚴格模式轉換、對象類型轉換: // 嚴格轉換(僅允許純數字字符串,不支持科學計數法) Integer strictInt = NumberUtils.createInteger("123"); // 123 Integer invalid = NumberUtils.createInteger("123.45"); // 拋出NumberFormatException // 轉換為Number對象(自動識別類型) Number number = NumberUtils.createNumber("123.45"); // 返回Double類型123.45 Number integer = NumberUtils.createNumber("678"); // 返回Integer類型678
注意:createNumber和createInteger等方法在轉換失敗時會拋出異常,適合需要嚴格校驗的場景(與toInt的默認值機制互補)。 三、避坑指南與最佳實踐 1. 依賴引入 NumberUtils 位于commons-lang3包中,需在項目中引入: <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> <!-- 推薦最新穩定版 --> </dependency>
注意使用 3.x 版本(commons-lang3),而非舊版的commons-lang,3.x 版本支持泛型且修復了多個數字轉換的 bug。 2. 方法選擇原則 - 需要默認值,不希望拋異常:用toInt、toLong、toDouble等方法
- 需要嚴格校驗,轉換失敗必須拋異常:用createInteger、createNumber等方法
- 僅判斷是否為有效數字,不轉換:用isNumber、isDigits方法
3. 精度問題處理 - 處理貨幣等對精度敏感的場景時,建議使用BigDecimal,NumberUtils 也提供了支持:
// 字符串轉BigDecimal(避免浮點數精度丟失) BigDecimal amount = NumberUtils.toScaledBigDecimal("123.45", 2); // 保留2位小數
- 避免用toFloat/toDouble處理金額,可能因精度問題導致計算誤差。
4. 性能考量 - NumberUtils 的方法性能優異,內部通過提前校驗和優化的轉換邏輯實現高效處理
- 對于頻繁轉換的場景(如大數據處理),建議先通過isNumber校驗再轉換,避免無效的異常處理開銷:
// 高性能轉換方式 String str = "12345"; int value; if (NumberUtils.isDigits(str)) { value = NumberUtils.toInt(str); } else { value = 0; }
結語:讓數字處理回歸簡單 數字處理看似基礎,卻直接影響代碼的簡潔度和可靠性。一個項目中如果充斥著大量重復的 try-catch 塊和 null 判斷,不僅開發效率低下,還會隱藏難以排查的 bug。 Apache Commons NumberUtils 的價值,在于它將這些 “基礎性” 的工作標準化、專業化。無論是簡單的類型轉換還是復雜的數字校驗,都能找到對應的工具方法,讓開發者從繁瑣的細節中解脫出來。 看完之后發現是不是非常贊!
|