ロケールと数値・通貨

ソフトウェアの国際化

昔と違い、現在はソフトウェア開発も国際的にあり、もともと世界中で使われることを前提としたソフトウェアも多く開発されるようになりました。その際に問題になるのは、言葉の違いのみならず、日付や通貨などの表示の仕方です。Javaでは、こういった概念をまとめて、ロケール(Locale)というクラスで処理しています。

ロケールとは、言語や国ごとに異なる単位、記号、日付、通貨の表記規則です。ここでは、Localeクラスを利用して、数値・通貨・日付をフォーマットする方法について紹介します。

Localeクラス

Localeクラスはプログラムを実行している環境のロケールを識別し、オブジェクトとして取得するためのクラスです。また、意図的にあらかじめ用意された任意のロケールをもつオブジェクトを生成することができます。

Localeクラスは「java.util」パッケージにあります。オブジェクトは通常のnew演算子を使用して生成する方法と、Localeクラスのstaticなメソッド、getDefault()メソッドを使用して生成する方法があります。ここでは、前者のサンプルを紹介します。

ClassSample01.java
package class7;

import java.util.*;

public class SampleClass01 {

	public static void main(String[] args) {
		//各言語と国のロケールを取得
		Locale jp = new Locale("ja","JP");	//日本のロケールを生成
		Locale us = new Locale("en","US");   	//アメリカのロケールを生成
		Locale ch = new Locale("zh","CN");	//中国のロケールを生成

		//各ロケールの言語と国名を出力
		System.out.println("日本のロケール 言語 : "
		+ jp.getDisplayLanguage() + " 国名 : " + jp.getDisplayCountry());
		System.out.println("アメリカのロケール 言語 : "
		+ us.getDisplayLanguage() + " 国名 :" + us.getDisplayCountry());
		System.out.println("中国のロケール 言語 : "
		+ ch.getDisplayLanguage() + " 国名 : " + ch.getDisplayCountry() );
	}

}
実行結果
日本のロケール 言語 : 日本語 国名 : 日本
アメリカのロケール 言語 : 英語 国名 :アメリカ合衆国
中国のロケール 言語 : 中国語 国名 : 中華人民共和国

9行目から11行目で、ロケールクラスのインスタンスを生成しています。引数の一つ目が言語、二つ目が国を表します。ロケールで用いられる言語コードと国コードの組み合わせの例は、以下のようになります(表7-1./表7-2.)。

表7-1.ロケールで用いる言語コードの例
言語 言語コード
日本語 ja
英語 en
中国語 zh
表7-2.ロケールで用いる国コードの例
国名 国コード
日本 JP
アメリカ US
イギリス GB
中国 CN

国名=言語でないことは、英語のケースを考えれば明らかです。英語はアメリカ、イギリス、オーストラリアなどの国々で使われていますし、逆にスイスのようにイタリア語やフランス語などの複数の言語が利用されているケースもあります。したがって、9行目のケースを例に挙げて見ると、「日本語、日本」という組み合わせになります。

このようにして設定した言語と国名はそれぞれ、「getDisplayLanguage()」メソッドと、「getDisplayCountry()」メソッドで取得できます。

数値と通貨

Localeクラスは、その他のクラスと用いることで実力を発揮します。まずここでは最初の例として、数値と通貨をを表すNumberFormatクラスとの組み合わせの例を見てみましょう。これにより、それぞれの言語、それぞんれの国における、通貨・数値の表現を得ることが可能です。

ClassSample02.java
package class7;

import java.util.*;
import java.text.*;

public class SampleClass02 {

	public static void main(String[] args) {
		int number =12300;

		//ロケールを取得
		Locale jp = new Locale("ja","JP");		//日本
		Locale us = new Locale("en","US");		//アメリカ
		Locale de = new Locale("de","DE");		//ドイツ
		//ロケールに対応したオブジェクトを生成
		NumberFormat nfJapan1 =NumberFormat.getInstance(jp);			//数値
		NumberFormat nfJapan2 =NumberFormat.getCurrencyInstance(jp); 	//通貨
		NumberFormat nfUsa1 =NumberFormat.getInstance(us);
		NumberFormat nfUsa2 =NumberFormat.getCurrencyInstance(us);
		NumberFormat nfFrance1 =NumberFormat.getInstance(de);
		NumberFormat nfFrance2 =NumberFormat.getCurrencyInstance(de);

		//フォーマットしたものを出力
		System.out.println(jp.getDisplayCountry());
		System.out.println("数値 : " + nfJapan1.format(number));
		System.out.println("通貨 : " + nfJapan2.format(number));
		System.out.println();

		System.out.println(us.getDisplayCountry());
		System.out.println("数値 : " + nfUsa1.format(number));
		System.out.println("通貨 : " + nfUsa2.format(number));
		System.out.println();

		System.out.println(de.getDisplayCountry());
		System.out.println("数値 : " + nfFrance1.format(number));
		System.out.println("通貨 : " + nfFrance2.format(number));

	}

}
実行結果
日本
数値 : 12,300
通貨 : ¥12,300

アメリカ合衆国
数値 : 12,300
通貨 : $12,300.00

ドイツ
数値 : 12.300
通貨 : 12.300,00 ?

実行結果を見てわかる通り、数値は3桁区切りに表示、通貨の先頭(または後方)には通貨を表す記号が表示されます。同じ数値でも、国ごとに数値・通貨の表示方法が違うことがわかります。

数値・通貨をあらわすのが、NumberFormatクラスで、これは「java.textパッケージ」にあります。生成についてはstaticなメソッドを利用して行います。

getInstanceメソッドで数値の、getCurrencyInstanceで、それぞれ指定したロケールの数値・通貨のクラスのインスタンスが得られ、そこにformat()メソッドを利用して数値を入れると、それぞれのフォーマットに変換された数値・通貨が文字列として得られるのです。

その他の使い方

Localeクラスはこの他にも、カレンダーを表すCalendarクラス、日付を表すDateFormatクラスと組み合わせて、言語・地域ごとのカレンダーや日付を得たりするなど、さまざまな利用方法がありますが、ここでは省略します。