คำตอบนี้อาจจะช้าไปหน่อย แต่ปรากฎว่าการแยกวิเคราะห์สตริงนั้นไม่น่าเกลียดอย่างที่ OP สันนิษฐาน ฉันพบว่ามันค่อนข้างง่ายและรัดกุม:
public static Locale fromString(String locale) {
String parts[] = locale.split("_", -1);
if (parts.length == 1) return new Locale(parts[0]);
else if (parts.length == 2
|| (parts.length == 3 && parts[2].startsWith("#")))
return new Locale(parts[0], parts[1]);
else return new Locale(parts[0], parts[1], parts[2]);
}
ฉันทดสอบสิ่งนี้ (บน Java 7) กับตัวอย่างทั้งหมดที่ให้ไว้ในเอกสาร Locale.toString (): "en", "de_DE", "_GB", "en_US_WIN", "de__POSIX", "zh_CN_ # Hans", "zh_TW_ # Hant-x-java "และ" th_TH_TH_ # u-nu-thai "
การอัปเดตที่สำคัญ : ไม่แนะนำให้ใช้ใน Java 7+ ตามเอกสารประกอบ :
โดยเฉพาะอย่างยิ่งไคลเอ็นต์ที่แยกวิเคราะห์ผลลัพธ์ของ toString เป็นช่องภาษาประเทศและตัวแปรสามารถดำเนินการต่อไปได้ (แม้ว่าจะไม่สนับสนุนอย่างยิ่ง ) แม้ว่าฟิลด์ตัวแปรจะมีข้อมูลเพิ่มเติมอยู่หากมีสคริปต์หรือส่วนขยาย
ใช้ Locale.forLanguageTag และ Locale.toLanguageTag แทนหรือถ้าคุณต้อง Locale.Builder