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.
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"
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.
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.
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);
}
}
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) + "\"),");
}
}
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.
Pas une énumération Java, mais une version JSON de celle-ci est disponible sur http://country.io/names.json
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:
Con:
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.
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! ...
//
}