2008-09-26 191 views
54

¿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 java enum de código abierto en los códigos de país ISO 3166-1

+3

Tenga en cuenta que ISO 3166-1-alpha-2 para Gran Bretaña no es GB como en su pregunta. –

+1

@Ken Sí, puedes, pero debes mantener esa lista y mantenerla sincronizada con wikipedia. El problema crece ... – jontejj

Respuesta

37

Este código obtiene 242 países en Sun Java 6:

String[] countryCodes = Locale.getISOCountries(); 

Aunque the ISO website afirma que hay 249 elementos ISO 3166-1 código alfa-2, aunque los javadoc enlaces a la misma información.

+7

Esta información está codificada. Debería actualizar JRE regularmente para mantenerse actualizado :) – BalusC

+0

En Java 7 hay 247 países, aún menos que en el estándar oficial (que es 249). – Jagger

+1

Los que faltan son: SOUTH SUDAN (SS) y SINT MAARTEN (DUTCH PART) (SX) – Jagger

2

Hay una manera fácil de generar esta enumeración con el nombre del idioma. Ejecutar 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) + "\"),"); 
    } 
} 
+0

Esto le da una lista de idiomas, no de países. – user27478

7

Así es como me genera una enumeración con el código del 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); 
    } 
} 
+0

agregó una línea en la impresión para habilitar intellitxt – NimChimpsky

+1

Eso no es una enumeración. – David

+0

@David genera el cuerpo de una enumeración – Bozho

0

Esto todavía no responde a la pregunta. También estaba buscando un tipo de enumerador para esto, y no encontré nada. Algunos ejemplos utilizando hashtable aquí, pero representan lo mismo que el incorporado obtener

Me gustaría un enfoque diferente. Así que he creado 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 datos.txt es un simple copiar y pegar & de la mesa de Wikipedia (basta con retirar todas las líneas adicionales, asegurándose de que tiene un país código y nombre del país por línea).

A continuación, sólo tiene que colocar 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! ... 
     // 
} 
79

ahora una implementación de código de país (ISO 3166-1alpha-2/alpha-3/numeric) lista como enumeración de Java 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

enum countryCode fue empaquetado en com.neovisionaries.i18n con otras enumeraciones de Java, languageCode (ISO 639-1) , LanguageAlpha3Code (ISO 639-2), LocaleCode, ScriptCode (ISO 15924) y CurrencyCode (ISO 4217) y registrado en el Repositorio Central de Maven.

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" 
+0

¡Hola Takahiko gracias por eso! Acabo de agregar tres países faltantes, lo siento, tenía prisa y simplemente bifurqué el repositorio, encontrará las actualizaciones aquí: https://github.com/bbossola/CountryCode –

+0

Hola Bruno! Gracias por encontrar las entradas faltantes (AL, AN y GN). Me referí a su repositorio bifurcado y los copié manualmente en mi repositorio. ¡Gracias! –

+0

Muchas gracias_ por esta biblioteca. –

0

No sabía acerca de esta cuestión hasta que tuve hace poco mi enumeración de Java de código abierto precisamente para este propósito! Increíble coincidencia!

Puse todo el código fuente en mi blog con la licencia de BSD caluse 3, así que no creo que nadie tenga ninguna información al respecto.

Se puede encontrar aquí. https://subversivebytes.wordpress.com/2013/10/07/java-iso-3166-java-enum/

Espero que sea útil y alivie los dolores de desarrollo.

+2

Su lista no se encuentra en Israel ... – Alicia

7

Si ya va a depender de la configuración regional de Java, a continuación, se sugiere emplear un HashMap sencilla en lugar de crear nuevas clases para los países etc.

Así es como yo lo usaría si tuviera que depender de la localización de Java solamente:

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 que llene el mapa, puede obtener el código ISO del nombre del país siempre que lo necesite. O puede convertirlo en un código ISO en el mapa del nombre del país, simplemente modifique el método 'poner' en consecuencia.

1

Si alguien ya está utilizando el 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 nv-i18n de Takahiko ya que, como él menciona, implementa ISO 3166-1.

0

He creado una enumeración, que se ocupa por el nombre del país inglés. Ver country-util.
En cada enumeración, puede llamar al 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 entornos nacionales Java
  • direccionables por el nombre completo del país
  • valores
  • Enum no están codificados, sino que genera 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.

contra:

  • No en repositorio de Maven
  • Lo más probable es simple/menos expresiva que las otras soluciones, que no conozco.
  • Creado para mis propias necesidades/no como tal mantenido. - Probablemente deberías clonar el repositorio.
Cuestiones relacionadas