Этот ответ может быть немного запоздалым, но оказывается, что разбор строки не так страшен, как предполагал 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.