posicion - extraer una parte de una cadena en java
¿Cómo obtener Locale desde su representación de Cadena en Java? (11)
¿Existe una manera ordenada de obtener una instancia de Locale de su "nombre de programa" como la devuelve el método toString()
Locale? Una solución obvia y fea sería analizar el String y luego construir una nueva instancia de Locale de acuerdo con eso, pero tal vez hay una mejor solución de manera / listo para eso.
La necesidad es que quiera almacenar algunas configuraciones específicas de la configuración regional en una base de datos SQL, incluidas las Locales mismas, pero sería feo poner ahí los objetos Locale serializados. Prefiero almacenar sus representaciones de String, que parecen ser bastante adecuadas en detalle.
Bien, almacenaría en su lugar una concatenación de Locale.getISO3Language()
de Locale.getISO3Language()
, getISO3Country()
y getVariant () como clave, lo que me permitiría llamar al Locale(String language, String country, String variant)
.
de hecho, depender de displayLanguage implica utilizar el idioma de la configuración regional para mostrarlo, lo que hace que dependa de la configuración regional, a diferencia del código de idioma ISO.
Como ejemplo, la clave de configuración regional sería almacenable como
en_EN
en_US
y así ...
Consulte Locale.getLanguage()
, Locale.getCountry()
... Almacene esta combinación en la base de datos en lugar del "programatic name"
...
Cuando desee volver a generar la configuración regional, use public Locale(String language, String country)
Aquí hay un código de muestra :)
// May contain simple syntax error, I don''t have java right now to test..
// but this is a bigger picture for your algo...
public String localeToString(Locale l) {
return l.getLanguage() + "," + l.getCountry();
}
public Locale stringToLocale(String s) {
StringTokenizer tempStringTokenizer = new StringTokenizer(s,",");
if(tempStringTokenizer.hasMoreTokens())
String l = tempStringTokenizer.nextElement();
if(tempStringTokenizer.hasMoreTokens())
String c = tempStringTokenizer.nextElement();
return new Locale(l,c);
}
Desde Java 7 existe el método de fábrica Locale.forLanguageTag
y el método de instancia Locale.toLanguageTag
utilizando etiquetas de lenguaje IETF .
El método que devuelve la configuración regional de cadena existe en la biblioteca LocaleUtils.toLocale(localeAsString)
-lang: LocaleUtils.toLocale(localeAsString)
Esta respuesta puede ser un poco tarde, pero resulta que analizar el hilo no es tan feo como suponía el OP. Lo encontré bastante simple y conciso:
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]);
}
Probé esto (en Java 7) con todos los ejemplos que figuran en la documentación de Locale.toString (): "en", "de_DE", "_GB", "en_US_WIN", "de__POSIX", "zh_CN_ # Hans", "zh_TW_ # Hant-x-java "y" th_TH_TH_ # u-nu-thai ".
ACTUALIZACIÓN IMPORTANTE : No se recomienda su uso en Java 7+ de acuerdo con la Locale :
En particular, los clientes que analizan el resultado de toString en el idioma, el país y los campos de variantes pueden continuar haciéndolo (aunque esto se desaconseja enérgicamente ), aunque el campo de la variante tendrá información adicional si el script o las extensiones están presentes.
Use Locale.forLanguageTag y Locale.toLanguageTag en su lugar, o si debe hacerlo, Locale.Builder.
Java proporciona muchas cosas con una implementación adecuada, se puede evitar una gran cantidad de complejidad:
Ejemplos:
Esto devuelve ms_MY .
String key = ms-MY; Locale locale = new Locale.Builder().setLanguageTag(key).build();
Esto volverá en_US
String str = "en-US"; Locale locale = LocaleUtils.toLocale(str); System.out.println(locale.toString());
También puedes usar constructores de locale.
// Construct a locale from a language code.(eg: en) new Locale(String language) // Construct a locale from language and country.(eg: en and US) new Locale(String language, String country) // Construct a locale from language, country and variant. new Locale(String language, String country, String variant)
Consulte este LocaleUtils y esta LocaleUtils Locale para explorar más métodos.
No parece haber un método de valor estático de Esto, lo cual es un poco sorprendente.
Una manera bastante fea, pero simple, sería iterar sobre Locale.getAvailableLocales()
, comparando sus valores toString
con su valor.
No es muy agradable, pero no se requiere un análisis de cadenas. Puede rellenar previamente un Map
de cadenas a configuraciones regionales y buscar la cadena de la base de datos en ese mapa.
Porque acabo de implementarlo:
En Groovy
/ Grails
sería:
def locale = Locale.getAvailableLocales().find { availableLocale ->
return availableLocale.toString().equals(searchedLocale)
}
Puedes usar esto en Android. Funciona bien para mí
private static final Pattern localeMatcher = Pattern.compile
("^([^_]*)(_([^_]*)(_#(.*))?)?$");
public static Locale parseLocale(String value) {
Matcher matcher = localeMatcher.matcher(value.replace(''-'', ''_''));
return matcher.find()
? TextUtils.isEmpty(matcher.group(5))
? TextUtils.isEmpty(matcher.group(3))
? TextUtils.isEmpty(matcher.group(1))
? null
: new Locale(matcher.group(1))
: new Locale(matcher.group(1), matcher.group(3))
: new Locale(matcher.group(1), matcher.group(3),
matcher.group(5))
: null;
}
Una vieja pregunta con muchas respuestas, pero aquí hay más soluciones:
Opción 1 :
org.apache.commons.lang3.LocaleUtils.toLocale("en_US")
Opcion 2 :
Locale.forLanguageTag("en-US")
Tenga en cuenta que la opción 1 es "guión bajo" entre idioma y país, y la opción 2 es "guión".