Czy ktoś wie o ogólnie dostępnym pakiecie java 1.5, który zawiera listę kodów krajów ISO 3166-1 jako enum lub EnumMap? W szczególności potrzebuję „elementów kodu ISO 3166-1-alpha-2”, tj. 2-znakowego kodu kraju, takiego jak „us”, „uk”, „de” itd. Utworzenie jednego jest dość proste (choć żmudne), ale jeśli w krainie apaczów jest już standardowy taki, który pozwoliłby zaoszczędzić trochę czasu.
java
internationalization
country-codes
iso-3166
Jason Jenkins
źródło
źródło
Odpowiedzi:
Obecnie implementacja listy kodów krajów ( ISO 3166-1 alpha-2 / alpha-3 / numeric ) jako wyliczenia Java jest dostępna na GitHub na licencji Apache w wersji 2.0.
Przykład:
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
Ostatnia edycja 2016-Jun-09
Wyliczenie CountryCode zostało spakowane do com.neovisionaries.i18n z innymi wyliczeniami Java, LanguageCode ( ISO 639-1 ), LanguageAlpha3Code ( ISO 639-2 ), LocaleCode, ScriptCode ( ISO 15924 ) i CurrencyCode ( ISO 4217 ) i zarejestrowane w Maven Central Magazyn.
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"
źródło
org.iban4j
) do obsługi kodów IBAN i BIC, a także wyliczenie CountryCodeTen kod pobiera 242 kraje w Sun Java 6:
Chociaż witryna ISO twierdzi, że istnieje 249 elementów kodu ISO 3166-1-alpha-2 , chociaż javadoc zawiera linki do tych samych informacji.
źródło
Java 1.6.0_33-b05
zawiera 248, których brakuje tylkoSS
teraz. Dzieje się tak po prostu dlatego, żeSS
jest to najnowszy (2011) kraj do dodania, a źródło Java 6 nie zostało zaktualizowane.Oto jak wygenerowałem wyliczenie z kodem kraju i nazwą kraju:
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); } }
źródło
Jeśli zamierzasz już polegać na lokalizacji Java, sugeruję użycie prostej HashMap zamiast tworzenia nowych klas dla krajów itp.
Oto, jak bym go użył, gdybym polegał tylko na lokalizacji 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()); }
Po wypełnieniu mapy możesz uzyskać kod ISO z nazwy kraju, kiedy tylko tego potrzebujesz. Możesz też ustawić go jako kod ISO do mapy nazwy kraju, po prostu odpowiednio zmodyfikuj metodę „wstaw”.
źródło
Istnieje łatwy sposób na wygenerowanie tego wyliczenia z nazwą języka. Wykonaj ten kod, aby wygenerować listę pól wyliczeniowych do wklejenia:
/** * 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) + "\"),"); } }
źródło
Nie jest to wyliczenie java, ale wersja JSON jest dostępna pod adresem http://country.io/names.json
źródło
Jeśli ktoś już korzysta z zestawu Amazon AWS SDK, obejmuje on
com.amazonaws.services.route53domains.model.CountryCode
. Wiem, że to nie jest idealne rozwiązanie, ale jest to alternatywa, jeśli już korzystasz z AWS SDK. W większości przypadków użyłbym Takahiko,nv-i18n
ponieważ, jak wspomina, implementuje ISO 3166-1.źródło
AWS Java SDK ma CountryCode .
źródło
To nadal nie daje odpowiedzi na pytanie. Szukałem też swego rodzaju wyliczającego do tego i nic nie znalazłem. Kilka przykładów użycia hashtable tutaj, ale reprezentują to samo, co wbudowane get
Poszedłbym na inne podejście. Stworzyłem więc skrypt w pythonie, który automatycznie generuje listę w Javie:
#!/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
gdzie plik data.txt jest prostym kopiowaniem i wklejaniem z tabeli Wikipedii (po prostu usuń wszystkie dodatkowe linie, upewniając się, że masz kod kraju i nazwę kraju w każdym wierszu).
Następnie umieść to w swojej statycznej klasie:
/** * 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! ... // }
źródło
Nie wiedziałem o tym pytaniu, dopóki niedawno nie otworzyłem mojego wyliczenia Java właśnie w tym celu! Niesamowity zbieg okoliczności!
Cały kod źródłowy umieściłem na swoim blogu z licencją BSD caluse 3, więc nie sądzę, by ktokolwiek miał z tym coś wspólnego.
Można znaleźć tutaj. https://subversivebytes.wordpress.com/2013/10/07/java-iso-3166-java-enum/
Mam nadzieję, że jest to przydatne i łagodzi bóle rozwojowe.
źródło
Utworzyłem wyliczenie, do którego należy adresować angielską nazwę kraju. Zobacz country-util .
W każdym wyliczeniu możesz wywołać,
getLocale()
aby uzyskać ustawienia regionalne języka Java.Z lokalizacji możesz uzyskać wszystkie informacje, do których jesteś przyzwyczajony, np. Dwuliterowy kod kraju 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; }
Zawodowiec:
Kon:
źródło