Is there an open source java enum of ISO 3166-1 country codes

前端 未结 11 2580
南笙
南笙 2020-12-04 10:57

Does anyone know of a freely available java 1.5 package that provides a list of ISO 3166-1 country codes as a enum or EnumMap? Specifically I need the \"ISO 3166-1-alpha-2

相关标签:
11条回答
  • 2020-12-04 11:06

    I didn't know about this question till I had just recently open-sourced my Java enum for exactly this purpose! Amazing coincidence!

    I put the whole source code on my blog with BSD caluse 3 license so I don't think anyone would have any beefs about it.

    Can be found here. https://subversivebytes.wordpress.com/2013/10/07/java-iso-3166-java-enum/

    Hope it is useful and eases development pains.

    0 讨论(0)
  • 2020-12-04 11:07

    Here's how I generated an enum with country code + country name:

    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 讨论(0)
  • 2020-12-04 11:09

    This still does not answer the question. I was also looking for a kind of enumerator for this, and did not find anything. Some examples using hashtable here, but represent the same as the built-in get

    I would go for a different approach. So I created a script in python to automatically generate the list in 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
    

    where the data.txt file is a simple copy&paste from Wikipedia table (just remove all extra lines, making sure you have a country code and country name per line).

    Then just place this into your static class:

    /**
     * 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 讨论(0)
  • 2020-12-04 11:10

    If anyone is already using the Amazon AWS SDK it includes com.amazonaws.services.route53domains.model.CountryCode. I know this is not ideal but it's an alternative if you already use the AWS SDK. For most cases I would use Takahiko's nv-i18n since, as he mentions, it implements ISO 3166-1.

    0 讨论(0)
  • 2020-12-04 11:11

    There is an easy way to generate this enum with the language name. Execute this code to generate the list of enum fields to paste :

     /**
      * 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 讨论(0)
  • 2020-12-04 11:13

    I have created an enum, which you address by the english country name. See country-util.
    On each enum you can call getLocale() to get the Java Locale.

    From the Locale you can get all the information you are used to, fx the ISO-3166-1 two letter country code.

    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:

    • Light weight
    • Maps to Java Locales
    • Addressable by full country name
    • Enum values are not hardcoded, but generated by a call to Locale.getISOCountries(). That is: Simply recompile the project against the newest java version to get any changes made to the list of countries reflected in the enum.

    Con:

    • Not in Maven repository
    • Most likely simpler / less expressive than the other solutions, which I don't know.
    • Created for my own needs / not as such maintained. - You should probably clone the repo.
    0 讨论(0)
提交回复
热议问题