¿Alguien sabe de un paquete java 1.5 disponible gratuitamente que proporcione una lista de códigos de país ISO 3166-1 como enum o EnumMap? Específicamente, necesito los "elementos de código ISO 3166-1-alpha-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 ya hay uno estándar en la tierra de apache o similar que ahorraría un poco de tiempo.
java
internationalization
country-codes
iso-3166
Jason Jenkins
fuente
fuente
Respuestas:
Ahora, una implementación de la lista de códigos de países ( ISO 3166-1 alpha-2 / alpha-3 / numérico ) como enumeración de Java está disponible en GitHub bajo la licencia Apache 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
La enumeración CountryCode 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"
fuente
org.iban4j
) para manejar códigos IBAN y BIC y también tiene una enumeración CountryCodeEste código incluye 242 países en Sun Java 6:
Aunque el sitio web de ISO afirma que hay 249 elementos de código ISO 3166-1-alpha-2 , aunque el javadoc enlaza con la misma información.
fuente
Java 1.6.0_33-b05
incluye 248, solo perdiéndoloSS
ahora. Esto se debe simplemente a queSS
es el país más reciente (2011) que se agregará y la fuente de Java 6 no se ha actualizado.Así es como generé una enumeración con código de país + nombre de 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); } }
fuente
Si ya va a confiar en la configuración regional de Java, le sugiero que use 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 completar el mapa, puede obtener el código ISO del nombre del país siempre que lo necesite. O también puede convertirlo en un código ISO para el mapa del nombre del país, simplemente modifique el método 'poner' en consecuencia.
fuente
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 de enumeración 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) + "\"),"); } }
fuente
No es una enumeración de Java, pero hay una versión JSON de esto disponible en http://country.io/names.json
fuente
Si alguien ya está utilizando el SDK de Amazon AWS, lo 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 de Takahikonv-i18n
ya que, como él menciona, implementa ISO 3166-1.fuente
AWS Java SDK tiene CountryCode .
fuente
Esto todavía no responde a la pregunta. También estaba buscando una especie de enumerador para esto y no encontré nada. Algunos ejemplos que usan hashtable aquí, pero representan lo mismo que el get incorporado
Yo optaría por 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 una simple copia y pegado 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 coloque esto en su 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! ... // }
fuente
¡No sabía acerca de esta pregunta hasta que recientemente había abierto mi enumeración de Java exactamente para este propósito! ¡Increíble coincidencia!
Puse todo el código fuente en mi blog con licencia BSD caluse 3, así que no creo que a nadie le moleste.
Se puede encontrar aquí. https://subversivebytes.wordpress.com/2013/10/07/java-iso-3166-java-enum/
Espero que sea útil y alivie los problemas de desarrollo.
fuente
He creado una enumeración, a la que se dirige por el nombre del país en inglés. Consulte country-util .
En cada enumeración puede llamar
getLocale()
para obtener la configuración 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:
Estafa:
fuente