在 Java 開發中,字串與基本數值類型 (int, long, double, float) 互轉是最高頻操作之一。雖然 API 簡單,但選擇錯誤方法可能導致效能損耗、空指針異常或進制解析錯誤。本文整理最標準、最高效的轉換寫法,並補充進制轉換、異常處理、效能對比等進階知識點。
Integer.parseInt(String) / Long.parseLong(String) / Double.parseDouble(String)int, long, double),無自動拆箱開銷。NumberFormatException,語義清晰。Integer.parseInt("FF", 16) → 255。int age = Integer.parseInt("25"); long id = Long.parseLong("1008611"); double price = Double.parseDouble("99.9"); // 進制轉換 int hex = Integer.parseInt("FF", 16); // 255 int bin = Integer.parseInt("1010", 2); // 10 Integer.valueOf(String) → .intValue()Integer 物件 (享有 -128~127 快取),再拆箱為 int。int age = Integer.valueOf("25").intValue(); // 兩步驟,不如 parseInt 直接 NumberFormatException (非 NPE),建議先 if (str != null && !str.isEmpty()) 防禦。" 123 " 會拋異常,需先 trim()。Integer.parseInt("3000000000") 拋異常,大數值改用 Long 或 BigInteger。String.valueOf(基本類型)Integer.toString(i) 等,無額外開銷。String s1 = String.valueOf(123); // "123" String s2 = String.valueOf(45.67); // "45.67" String s3 = String.valueOf(true); // "true" Integer.toString(int) / Long.toString(long)Integer.toString(255, 16) → "ff"。String hex = Integer.toString(255, 16); // "ff" (小寫) "" + 數值new StringBuilder().append(數值).toString(),建立額外物件。// 避免在熱點代碼使用 String s = "" + 123; 需求:千分位分隔、固定小數位、科學記號、貨幣符號 → 使用 String.format 或 DecimalFormat。
// String.format (JDK 1.5+) String price = String.format("%,.2f", 1234567.89); // "1,234,567.89" String pct = String.format("%.2f%%", 0.1234 * 100); // "12.34%" // DecimalFormat (更強大、可複用) DecimalFormat df = new DecimalFormat("#,##0.00"); String fmt = df.format(12345.6); // "12,345.60" // 區域化貨幣 NumberFormat currency = NumberFormat.getCurrencyInstance(Locale.TAIWAN); String twd = currency.format(12345); // "NT$12,345" | 場景 | 最佳寫法 | 避免寫法 | 理由 |
|---|---|---|---|
| String → int | Integer.parseInt(s) | new Integer(s) / Integer.valueOf(s).intValue() | 直接返回基本型,無物件分配 |
| String → long | Long.parseLong(s) | 同左 | 同左 |
| String → double | Double.parseDouble(s) | 同左 | 同左 |
| int → String | String.valueOf(i) | "" + i | 無 StringBuilder 臨時物件 |
| 需指定進制 | Integer.toString(i, 16) | 手寫轉換邏輯 | 標準庫優化、無 Bug |
| 格式化輸出 | String.format / DecimalFormat | 手動拼接 | 支援區域化、四捨五入、對齊 |
public final class ConvertUtils { private ConvertUtils() {} // String → int, 預設值 public static int toInt(String s, int defaultVal) { if (s == null || s.isEmpty()) return defaultVal; try { return Integer.parseInt(s.trim()); } catch (NumberFormatException e) { return defaultVal; } } // String → long public static long toLong(String s, long defaultVal) { if (s == null || s.isEmpty()) return defaultVal; try { return Long.parseLong(s.trim()); } catch (NumberFormatException e) { return defaultVal; } } // String → double public static double toDouble(String s, double defaultVal) { if (s == null || s.isEmpty()) return defaultVal; try { return Double.parseDouble(s.trim()); } catch (NumberFormatException e) { return defaultVal; } } // 數值 → 格式化字串 public static String formatNumber(Number num, String pattern) { if (num == null) return ""; return new DecimalFormat(pattern).format(num); } } 掌握 parseXxx / valueOf / toString / String.format 的正確使用時機,能寫出更簡潔、高效、健壯的代碼。建議專案統一引入上述工具類,集中處理異常、預設值、格式化邏輯,避免分散在業務代碼中造成維護負擔。