¿Existe una enumeración java de código abierto de los códigos de país ISO 3166-1?

83

¿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.

Jason Jenkins
fuente
3
Tenga en cuenta que ISO 3166-1-alpha-2 para Gran Bretaña es GB, no Reino Unido, como en su pregunta.
Adrian Smith
1
@Ken, sí, puedes, pero luego debes mantener esa lista y mantenerla sincronizada con wikipedia. El problema crece ...
jontejj

Respuestas:

110

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"
Takahiko Kawasaki
fuente
Hola Takahiko, gracias por eso! Acabo de agregar tres países que faltan, lo siento, tenía prisa y acabo de bifurcar el repositorio, encontrará las actualizaciones aquí: github.com/bbossola/CountryCode
Bruno Bossola
¡Hola Bruno! Gracias por encontrar las entradas que faltan (AL, AN y GN). Me referí a su repositorio bifurcado y los copié manualmente en mi repositorio. ¡Gracias!
Takahiko Kawasaki
Gracias tanto para esta biblioteca.
Matt Ball
En caso de que esté haciendo cosas bancarias, hay una biblioteca con licencia Apache-2 llamada " iban4j " (espacio de nombres org.iban4j) para manejar códigos IBAN y BIC y también tiene una enumeración CountryCode
David Tonhofer
54

Este código incluye 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-alpha-2 , aunque el javadoc enlaza con la misma información.

McDowell
fuente
7
Esta información está codificada. Necesitaría actualizar JRE regularmente para mantenerse actualizado :)
BalusC
En Java 7 hay 247 países, todavía menos que en el estándar oficial (que es 249).
Jagger
2
Los que faltan son: SUDÁN DEL SUR (SS) y SINT MAARTEN (PARTE HOLANDESA) (SX)
Jagger
Java 1.6.0_33-b05incluye 248, solo perdiéndolo SSahora. Esto se debe simplemente a que SSes el país más reciente (2011) que se agregará y la fuente de Java 6 no se ha actualizado.
Andyb
1
El OP solicita "un paquete java 1.5 disponible gratuitamente": ¿cómo se aplica a eso una respuesta que solicita Java6 o Java7? Voto en contra.
Bruno Bossola
11

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);
    }
}
Bozho
fuente
agregó una línea impresa para habilitar intellitxt
NimChimpsky
2
Eso no es una enumeración.
David
@David genera el cuerpo de una enumeración
Bozho
1
Buen código de generación, pero debes eliminar los caracteres especiales. Por ejemplo, CÔTE_D'IVOIRE no se puede utilizar como enumeración: P.
Jacob van Lingen
9

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.

sskular
fuente
4

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) + "\"),");
  }
 }
Christophe Desguez
fuente
Esto le brinda una lista de idiomas, no de países.
gerdemb
1

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 Takahiko nv-i18nya que, como él menciona, implementa ISO 3166-1.

Abdielou
fuente
0

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! ...
         //
}
bruno.braga
fuente
0

¡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.

george_h
fuente
0

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:

  • Peso ligero
  • Mapas a configuraciones regionales de Java
  • Direccionable por nombre completo del país
  • Los valores de enumeración 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 reciente de Java para obtener los cambios realizados en la lista de países reflejada en la enumeración.

Estafa:

  • No en el repositorio de Maven
  • Probablemente más simple / menos expresivo que las otras soluciones, que no sé.
  • Creado para mis propias necesidades / no mantenido como tal. - Probablemente deberías clonar el repositorio.
Hervian
fuente