85 votes

Existe-t-il un enum java open source des codes pays ISO 3166-1 ?

Quelqu'un connaît-il un paquetage java 1.5 disponible gratuitement qui fournit une liste des codes de pays de l'ISO 3166-1 sous la forme d'un enum ou d'un EnumMap ? Plus précisément, j'ai besoin des "codets ISO 3166-1-alpha-2", c'est-à-dire les codes pays à 2 caractères comme "us", "uk", "de", etc. En créer un est assez simple (bien que fastidieux), mais s'il existe déjà un standard dans le monde d'Apache ou autre, cela permettrait de gagner un peu de temps.

3 votes

Notez que la norme ISO 3166-1-alpha-2 pour la Grande-Bretagne est GB et non UK comme dans votre question.

1 votes

@Ken oui vous pouvez mais alors vous devez maintenir cette liste et la garder en synchronisation avec wikipedia. Le problème s'amplifie...

115voto

Takahiko Kawasaki Points 1313

Maintenant, une implémentation du code pays ( ISO 3166-1 alpha-2 / alpha-3 / numérique ) en tant qu'enum Java est disponible sur GitHub sous la 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-Jun-09

L'enum CountryCode a été intégré dans com.neovisionaries.i18n avec d'autres enums Java, LanguageCode ( ISO 639-1 ), LanguageAlpha3Code ( ISO 639-2 ), LocaleCode, ScriptCode ( ISO 15924 ) et CurrencyCode ( ISO 4217 ) et enregistré dans le dépôt 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"

0 votes

Salut Takahiko, merci pour cela ! Je viens d'ajouter trois pays manquants, désolé j'étais pressé et je viens de forker le repo, vous trouverez les mises à jour ici : github.com/bbossola/CountryCode

0 votes

Bonjour Bruno ! Merci d'avoir trouvé les entrées manquantes (AL, AN et GN). Je me suis référé à votre dépôt forké et les ai copiées manuellement dans mon dépôt. Merci !

1 votes

Merci. tellement pour cette bibliothèque.

54voto

McDowell Points 62645

Ce code obtient 242 pays dans Sun Java 6 :

String[] countryCodes = Locale.getISOCountries();

Bien que le site web de l'ISO affirme qu'il y a 249 Les codets de l'ISO 3166-1-alpha-2 bien que le javadoc des liens vers les mêmes informations.

8 votes

Cette information est codée en dur. Vous devez mettre à jour le JRE régulièrement pour rester à jour :)

1 votes

Dans Java 7, il y a 247 pays, toujours moins que dans la norme officielle (qui est de 249).

3 votes

Ceux qui manquent sont : SOUDAN DU SUD (SS) et SINT MAARTEN (DUTCH PART) (SX).

11voto

Bozho Points 273663

Voici comment j'ai généré un enum avec le code du 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);
    }
}

0 votes

Ajout d'une ligne dans print pour activer intellitxt

0 votes

@David il génère le corps d'un enum

1 votes

Beau code de génération, mais il faut enlever les caractères spéciaux. Par exemple CÔTE_D'IVOIRE ne peut pas être utilisé comme un enum :P.

9voto

sskular Points 41

Si vous comptez déjà vous appuyer sur la locale Java, je vous suggère d'utiliser un simple HashMap au lieu de créer de nouvelles classes pour les pays, etc.

Voici comment je l'utiliserais si je devais me fier uniquement à 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());
}

Après avoir rempli la carte, vous pouvez obtenir le code ISO du nom du pays quand vous en avez besoin. Vous pouvez aussi en faire une carte du code ISO au nom de pays, en modifiant simplement la méthode 'put' en conséquence.

4voto

Il existe un moyen simple de générer cet enum avec le nom de la langue. Exécutez ce code pour générer la liste des champs de l'enum à 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) + "\"),");
  }
 }

0 votes

Vous obtenez ainsi une liste de langues, et non de pays.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X