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