codigos - ¿Existe una enum de Java de código abierto de códigos de país ISO 3166-1?
iso 3166-2 (10)
Así es como he generado una enumeración con el código de país + nombre del país:
package countryenum;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
public class CountryEnumGenerator {
public static void main(String[] args) {
String[] countryCodes = Locale.getISOCountries();
List<Country> list = new ArrayList<Country>(countryCodes.length);
for (String cc : countryCodes) {
list.add(new Country(cc.toUpperCase(), new Locale("", cc).getDisplayCountry()));
}
Collections.sort(list);
for (Country c : list) {
System.out.println("/**" + c.getName() + "*/");
System.out.println(c.getCode() + "(/"" + c.getName() + "/"),");
}
}
}
class Country implements Comparable<Country> {
private String code;
private String name;
public Country(String code, String name) {
super();
this.code = code;
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int compareTo(Country o) {
return this.name.compareTo(o.name);
}
}
¿Alguien sabe de un paquete java 1.5 de acceso libre que proporciona una lista de códigos de país ISO 3166-1 como enumeración o EnumMap? Específicamente necesito los "elementos de código ISO 3166-1-alfa-2", es decir, el código de país de 2 caracteres como "us", "uk", "de", etc. Crear uno es bastante simple (aunque tedioso), pero si hay uno estándar que ya está en apache o algo similar que ahorraría un poco de tiempo.
Hay una manera fácil de generar esta enumeración con el nombre del idioma. Ejecute este código para generar la lista de campos enum para pegar:
/**
* This is the code used to generate the enum content
*/
public static void main(String[] args) {
String[] codes = java.util.Locale.getISOLanguages();
for (String isoCode: codes) {
Locale locale = new Locale(isoCode);
System.out.println(isoCode.toUpperCase() + "(/"" + locale.getDisplayLanguage(locale) + "/"),");
}
}
Esto todavía no responde la pregunta. También estaba buscando un tipo de enumerador para esto, y no encontré nada. Algunos ejemplos que usan hashtable aquí, pero representan lo mismo que el get incorporado
Yo elegiría un enfoque diferente. Así que creé un script en python para generar automáticamente la lista en Java:
#!/usr/bin/python
f = open("data.txt", ''r'')
data = []
cc = {}
for l in f:
t = l.split(''/t'')
cc = { ''code'': str(t[0]).strip(),
''name'': str(t[1]).strip()
}
data.append(cc)
f.close()
for c in data:
print """
/**
* Defines the <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">ISO_3166-1_alpha-2</a>
* for <b><i>%(name)s</i></b>.
* <p>
* This constant holds the value of <b>{@value}</b>.
*
* @since 1.0
*
*/
public static final String %(code)s = /"%(code)s/";""" % c
donde el archivo data.txt es un simple copiar y pegar de la tabla de Wikipedia (simplemente elimine todas las líneas adicionales, asegurándose de tener un código de país y un nombre de país por línea).
Luego solo coloca esto en tu clase estática:
/**
* Holds <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">ISO_3166-1_alpha-2</a>
* constant values for all countries.
*
* @since 1.0
*
* </p>
*/
public class CountryCode {
/**
* Constructor defined as <code>private</code> purposefully to ensure this
* class is only used to access its static properties and/or methods.
*/
private CountryCode() { }
/**
* Defines the <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">ISO_3166-1_alpha-2</a>
* for <b><i>Andorra</i></b>.
* <p>
* This constant holds the value of <b>{@value}</b>.
*
* @since 1.0
*
*/
public static final String AD = "AD";
//
// and the list goes on! ...
//
}
Este código obtiene 242 países en Sun Java 6:
String[] countryCodes = Locale.getISOCountries();
Aunque el sitio web de ISO afirma que hay 249 elementos de código ISO 3166-1-alfa-2 , aunque el javadoc se vincula a la misma información.
¡No sabía acerca de esta pregunta hasta que recientemente había abierto mi enum de Java para este propósito! Increíble coincidencia!
Puse todo el código fuente en mi blog con licencia de BSD caluse 3, así que no creo que nadie tenga ninguna información al respecto.
Puede ser encontrado aquí. https://subversivebytes.wordpress.com/2013/10/07/java-iso-3166-java-enum/
Espero que sea útil y alivie los dolores del desarrollo.
Si ya vas a confiar en la configuración regional de Java, te sugiero usar un HashMap simple en lugar de crear nuevas clases para países, etc.
Así es como lo usaría si tuviera que confiar solo en la localización de Java:
private HashMap<String, String> countries = new HashMap<String, String>();
String[] countryCodes = Locale.getISOCountries();
for (String cc : countryCodes) {
// country name , country code map
countries.put(new Locale("", cc).getDisplayCountry(), cc.toUpperCase());
}
Después de llenar el mapa, puede obtener el código ISO del nombre del país siempre que lo necesite. O bien, puede convertirlo en un código ISO en el mapa del nombre del país, simplemente modifique el método ''poner'' en consecuencia.
No es una enumeración de Java, pero una versión de JSON está disponible en http://country.io/names.json
Si alguien ya está usando Amazon AWS SDK, incluye com.amazonaws.services.route53domains.model.CountryCode
. Sé que esto no es ideal, pero es una alternativa si ya usa AWS SDK. Para la mayoría de los casos usaría el nv-i18n
Takahiko ya que, como él menciona, implementa ISO 3166-1.
Ahora una implementación del código de país ( ISO 3166-1 alpha-2 / alpha-3 / numeric ) lista como Java enum está disponible en GitHub bajo Apache License versión 2.0.
Ejemplo:
CountryCode cc = CountryCode.getByCode("JP");
System.out.println("Country name = " + cc.getName()); // "Japan"
System.out.println("ISO 3166-1 alpha-2 code = " + cc.getAlpha2()); // "JP"
System.out.println("ISO 3166-1 alpha-3 code = " + cc.getAlpha3()); // "JPN"
System.out.println("ISO 3166-1 numeric code = " + cc.getNumeric()); // 392
Última edición 2016-jun-09
CountryCode enum se empaquetó en com.neovisionaries.i18n con otras enumeraciones Java, LanguageCode ( ISO 639-1 ), LanguageAlpha3Code ( ISO 639-2 ), LocaleCode, ScriptCode ( ISO 15924 ) y CurrencyCode ( ISO 4217 ) y se registró en Maven Central Repositorio.
Maven
<dependency>
<groupId>com.neovisionaries</groupId>
<artifactId>nv-i18n</artifactId>
<version>1.22</version>
</dependency>
Gradle
dependencies {
compile ''com.neovisionaries:nv-i18n:1.22''
}
GitHub
https://github.com/TakahikoKawasaki/nv-i18n
Javadoc
http://takahikokawasaki.github.com/nv-i18n/
OSGi
Bundle-SymbolicName: com.neovisionaries.i18n
Export-Package: com.neovisionaries.i18n;version="1.22.0"
He creado una enumeración, que abordas por el nombre del país inglés. Ver country-util .
En cada enumeración, puede llamar a getLocale()
para obtener la getLocale()
regional de Java.
Desde la configuración regional, puede obtener toda la información a la que está acostumbrado, fx el código de país de dos letras ISO-3166-1.
public enum Country{
ANDORRA(new Locale("AD")),
AFGHANISTAN(new Locale("AF")),
ANTIGUA_AND_BARBUDA(new Locale("AG")),
ANGUILLA(new Locale("AI")),
//etc
ZAMBIA(new Locale("ZM")),
ZIMBABWE(new Locale("ZW"));
private Locale locale;
private Country(Locale locale){
this.locale = locale;
}
public Locale getLocale(){
return locale;
}
Pro:
- Peso ligero
- Mapas a Java Locales
- Dirigible por nombre completo del país
- Los valores de Enum no están codificados, sino que se generan mediante una llamada a Locale.getISOCountries (). Es decir: simplemente vuelva a compilar el proyecto con la versión más nueva de Java para obtener los cambios realizados en la lista de países reflejada en la enumeración.
Estafa:
- No en el repositorio Maven
- Lo más probable es que sea más simple / menos expresivo que las otras soluciones, que no sé.
- Creado para mis propias necesidades / no como tal mantenido. - Probablemente deberías clonar el repositorio.