web-dev-qa-db-fra.com

Existe-t-il une énumération Java open source de codes de pays ISO 3166-1?

Est-ce que quelqu'un connaît un package Java 1.5 disponible gratuitement qui fournit une liste des codes de pays ISO 3166-1 sous forme d'enum ou d'enumMap? Plus précisément, j'ai besoin des "éléments de code ISO 3166-1-alpha-2", c'est-à-dire des codes de pays à 2 caractères tels que "nous", "uk", "de", etc. Il en existe déjà une version standard dans Apache Land ou une solution similaire qui permettrait de gagner un peu de temps.

70
Jason Jenkins

Désormais, une implémentation de code de pays ( ISO 3166-1alpha-2 / alpha-3 / numérique ) en tant que liste Java enum est disponible sur GitHub sous Licence Apache version 2.0. .

Exemple:

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

Dernière édition 2016-juin-09

CountryCode enum a été intégré à com.neovisionaries.i18n avec d’autres énumérations Java, LanguageCode ( ISO 639-1 ), LanguageAlpha3Code ( ISO 639-2 ), LocaleCode, ScriptCode ( ISO 15924 ) et CurrencyCode ( ISO 4217 ) et enregistrés dans le référentiel central 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"
90
Takahiko Kawasaki

Ce code obtient 242 pays dans Sun Java 6:

String[] countryCodes = Locale.getISOCountries();

Bien que le site Web de l'ISO affirme qu'il existe 249 ISO 3166-1-alpha-2 éléments de code, bien que le javadoc renvoie à la même information.

44
McDowell

Si vous comptez déjà utiliser les paramètres régionaux Java, je vous suggère d'utiliser un simple HashMap plutôt que de créer de nouvelles classes pour les pays, etc.

Voici comment je l'emploierais si je comptais uniquement sur la localisation 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());
}

Une fois que vous avez rempli la carte, vous pouvez obtenir le code ISO du nom du pays chaque fois que vous en avez besoin ..__ou.

9
sskular

Voici comment j'ai généré une énumération avec le code pays + le nom du pays:

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);
    }
}
8
Bozho

Il existe un moyen simple de générer cette énumération avec le nom de langue . Exécutez ce code pour générer la liste des champs d’énum à coller:

 /**
  * 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) + "\"),");
  }
 }
3
Christophe Desguez

Si quelqu'un utilise déjà le kit Amazon AWS SDK, il inclut com.amazonaws.services.route53domains.model.CountryCode. Je sais que ce n'est pas idéal, mais c'est une alternative si vous utilisez déjà le kit SDK AWS. Dans la plupart des cas, j'utiliserais le nv-i18n de Takahiko car, comme il l'a mentionné, il met en œuvre l'ISO 3166-1.

1
abdielou

Pas une énumération Java, mais une version JSON de celle-ci est disponible sur http://country.io/names.json

1
Ben Dowling

J'ai créé un enum, auquel vous adressez le nom de pays anglais. Voir country-util .
Sur chaque énumération, vous pouvez appeler getLocale() pour obtenir les paramètres régionaux Java. 

À partir des paramètres régionaux, vous pouvez obtenir toutes les informations dont vous avez l'habitude, par exemple le code de pays à deux lettres 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: 

  • Poids léger
  • Cartes pour les régions Java
  • Adressable par nom de pays complet 
  • Les valeurs Enum ne sont pas codées en dur, mais générées par un appel à Locale.getISOCountries (). C’est-à-dire: recompilez simplement le projet avec la version la plus récente de Java pour obtenir les modifications apportées à la liste des pays figurant dans l’énumération.

Con: 

  • Pas dans le référentiel Maven
  • Probablement plus simple/moins expressif que les autres solutions, que je ne connais pas.
  • Créé pour mes propres besoins/non maintenu en tant que tel. - Vous devriez probablement cloner le repo.
0
Hervian

Je ne connaissais pas cette question avant d'avoir ouvert récemment mon enum Java à cet effet! Coïncidence incroyable!

J'ai mis tout le code source sur mon blog avec une licence BSD caluse 3 afin que je ne pense pas que quiconque voudrait en savoir plus.

Peut être trouvé ici . https://subversivebytes.wordpress.com/2013/10/07/Java-iso-3166-Java-enum/

J'espère que c'est utile et que cela soulage les douleurs de développement.

0
george_h

Cela ne répond toujours pas à la question. Je cherchais aussi une sorte d’agent recenseur pour cela et je n’ai rien trouvé. Quelques exemples utilisant hashtable ici, mais qui sont identiques à ceux de get intégré

J'irais pour une approche différente. J'ai donc créé un script en python pour générer automatiquement la liste 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

où le fichier data.txt est un simple copier-coller de la table Wikipedia (il suffit de supprimer toutes les lignes supplémentaires, en veillant à disposer d'un code de pays et d'un nom de pays par ligne).

Ensuite, placez ceci dans votre classe statique:

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