วิธีที่ 1: ใช้ Double.parseDouble() + Try-Catch
เมธอด Double.parseDouble(String) แปลงสตริงเป็น double โยน NumberFormatException หากแปลงไม่ได้ และ NullPointerException หากเป็น null
ตัวอย่าง
import java.util.Scanner;
public class ParsableToDouble {
public static void main(String[] args) {
try {
Scanner sc = new Scanner(System.in);
System.out.println("Enter a string value: ");
String str = sc.next();
Double doub = Double.parseDouble(str);
System.out.println("Value: " + doub);
} catch (NumberFormatException ex) {
System.out.println("Given String is not parsable to double");
}
}
}
ผลลัพธ์
Enter a string value: 2245g
Given String is not parsable to double
วิธีที่ 2: ใช้ Double.valueOf()
ทำงานเหมือน parseDouble() แต่คืนค่า Boolean object (wrapper) แทน primitive
Double doub = Double.valueOf(str); // คืนค่า Double object
วิธีที่ 3: ใช้ Constructor Double(String)
Deprecated since Java 9 - ไม่แนะนำให้ใช้ใหม่
Double doub = new Double(str); // @Deprecated
วิธีที่ 4: ใช้ Regex ตรวจสอบก่อนแปลง (No Exception)
import java.util.regex.*;
public class CheckDoubleRegex {
private static final Pattern DOUBLE_PATTERN = Pattern.compile(
"^[-+]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?$"
);
public static boolean isParsableToDouble(String str) {
return str != null && DOUBLE_PATTERN.matcher(str).matches();
}
public static void main(String[] args) {
String[] tests = {"123.45", "-0.5", "1e10", "abc", "12.34.56", ""};
for (String s : tests) {
System.out.println(s + " -> " + isParsableToDouble(s));
}
}
}
การเปรียบเทียบ
| วิธี | ข้อดี | ข้อเสีย |
|---|---|---|
| try-catch parseDouble | มาตรฐาน จัดการทุกกรณีได้ | Exception overhead (ช้าถ้า fail บ่อย) |
| Regex | ไม่มี exception เร็วกว่าสำหรับ invalid input | Regex ซับซ้อน อาจพลาด edge case |
| Apache Commons NumberUtils.isCreatable() | สะดวก ครอบคลุม | ต้องเพิ่ม dependency |
แนะนำ
ใช้ try-catch parseDouble() สำหรับกรณีทั่วไป (โค้ดชัดเจน มาตรฐาน) ใช้ Regex หากต้อง validate จำนวนมากและ performance critical