2013-03-27 4 views
6

私のアプリには外部プロセスからの文字列が入力されています。各文字列は2文字または5文字の長さで、java.util.Localeを表します。たとえば、次のように文字列からJavaロケールを検証してインスタンス化する方法は?

EN-US

KO

最初の例は、 "en" がISO言語コードで、 "私たちは、" ISOの国である5-char型の文字列ですコード。これは "en_US"ロケールに対応する必要があります。 2番目の例は2文字の文字列で、 "ko"はISO言語コードで、 "ko_KR"(韓国語)ロケールに対応する必要があります。

これらの文字列(2文字または5文字のバラエティ)を取得し、それを(サポートされているJavaのロケールとして)検証してから、Localeインスタンスを作成します。

私はロケールは、箱から出して、このような検証に付属していることを期待しているだろうが、残念ながらこのコードは、例外がスローされずに実行されます。

Locale loc = new Locale("waawaaweewah", "greatsuccess"); 

// Prints: "waawaaweewah" 
System.out.println(loc.getDisplayLanguage()); 

だから私は尋ねる、私にこれらの文字列がなる2つの形態を与えられました

  • 文字列(両方の形式)を検証し、存在しないJava 6ロケールに対応する文字列の例外をスローします。および
  • 文字列から新しいロケールをインスタンス化しますか?この質問は本当に

おかげで、事前になど、私は唯一の「KO」を持っており、それは「語ko_KR」ロケールにマッピングする必要があるかもしれません、2文字の形に適用されます!

+0

ハイフンで入力を分割し、2文字のトークンを言語として扱うと仮定すると、2番目のケースでは '新しいロケール(言語)'を、最初のケースでは '新しいロケール(言語、国)'をどうでしょうか?そして国? – asgs

答えて

6

Locale.getISOCountries()Locale.getISOLanguages()

リターンそれぞれISO 3166およびISO 639で定義され、ロケールを作成するために使用することができる全ての2文字の国と言語コードのリスト。

入力を検証するために使用できます。

1

あなたは2つのオプションがあり、

  1. 使用行うためのライブラリこのcommons-langLocaleStringを解析することができる方法がありますLocaleUtilsクラスがあります。 Localeのための有効な国コードの異なるセットが多数あるよう
  2. は、独自の方法が、ここでの検証は非自明である - javadoc

出発点はStringを分割することです参照要素数に切り替える:

public static Locale parseLocale(final String locale) { 
    final String[] localeArr = locale.split("_"); 
    switch (localeArr.length) { 
     case 1: 
      return new Locale(localeArr[0]); 
     case 2: 
      return new Locale(localeArr[0], localeArr[1]); 
     case 3: 
      return new Locale(localeArr[0], localeArr[1], localeArr[2]); 
     default: 
      throw new IllegalArgumentException("Invalid locale format;"); 
    } 
} 

おそらくあなたはすべての有効な国コードと言語のリストを取得し、コンストラクタを呼び出す前に、有効な値にString[]の要素を比較する必要があります。

関連する問題