Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのNumberFormatクラス徹底解説!ロケールに対応した数値フォーマットの基本と使い方

はじめに

NumberFormatは、任意のロケール(地域・言語設定)に合わせて数値をフォーマット(書式設定)したり、文字列を数値として解析(パース)したりするためのクラスです。java.textパッケージに属しており、すべての数値フォーマットクラスに共通する抽象基底クラスとして定義されています。

このクラスを利用することで、国ごとに異なる小数点記号(「.」と「,」)、桁区切り文字、通貨記号などを意識することなく、適切な形式で数値を出力できます。

NumberFormatクラスの主なメソッド

以下は、NumberFormatクラスが提供する代表的なメソッドの一覧です。

戻り値の型メソッドと説明
Objectclone()
Cloneableインターフェースのcloneメソッドをオーバーライドしています。
booleanequals(Object obj)
equalsメソッドをオーバーライドし、オブジェクトの等価性を判定します。
Stringformat(double number)
formatメソッドの特殊化です。double型の数値を文字列として返します。
abstract StringBufferformat(double number, StringBuffer toAppendTo, FieldPosition pos)
formatメソッドの抽象宣言です。指定したStringBufferに整形結果を追加します。
Stringformat(long number)
formatメソッドの特殊化です。long型の数値を文字列として返します。
abstract StringBufferformat(long number, StringBuffer toAppendTo, FieldPosition pos)
formatメソッドの抽象宣言です。long型の数値に対する整形処理を担います。

また、インスタンスを取得するための静的ファクトリメソッドとして、汎用のgetInstance()、通貨向けのgetCurrencyInstance()、パーセント表示向けのgetPercentInstance()なども用意されています。

使用例1:通貨フォーマットの取得

ここでは、フランスのロケールに基づく通貨フォーマッタを取得し、数値を整形する例を見てみましょう。

import java.text.NumberFormat;
import java.util.Locale;

public class Demo {
    public static void main(String[] args) {
        NumberFormat n = NumberFormat.getCurrencyInstance(Locale.FRANCE);
        double points = 2.15;
        double totalPoints = points * 1000;
        System.out.println(n.format(points));
        System.out.println(n.format(totalPoints));
    }
}

実行結果

2,15 €
2 150,00 €

フランスでは小数点にカンマ(,)、桁区切りにスペースが使用されるため、「2.15」が「2,15 €」、「2150」が「2 150,00 €」と出力されます。このように、ロケールを切り替えるだけで地域固有の表記に自動的に対応できるのがNumberFormatの強みです。

使用例2:異なるロケールでの数値表示の比較

次に、デンマークとアメリカのロケールを指定して、同じ数値をそれぞれ整形した結果を比較してみます。

import java.text.NumberFormat;
import java.util.Locale;

public class Demo {
    public static void main(String[] args) {
        Locale enLocale = new Locale("en", "US");
        Locale daLocale = new Locale("da", "DK");

        NumberFormat numberFormat = NumberFormat.getInstance(daLocale);
        System.out.println(numberFormat.format(100.76));

        numberFormat = NumberFormat.getInstance(enLocale);
        System.out.println(numberFormat.format(100.76));
    }
}

実行結果

100,76
100.76

デンマークのロケールでは小数点にカンマが使われるため「100,76」と表示され、一方アメリカのロケールではピリオドが使われて「100.76」と表示されます。

まとめ

NumberFormatクラスを使うことで、ロケールごとの数値表現の違い(小数点記号、桁区切り、通貨記号など)を簡単に吸収できます。多言語・多地域対応のアプリケーションを開発する際には、数値を直接文字列連結せず、必ずNumberFormat経由で整形することをおすすめします。

  1. Javaのsuperキーワードとは?使い方とサンプルコードを徹底解説

    JavaのsuperキーワードとはJavaにおけるsuperキーワードは、サブクラスから直接の親クラス(スーパークラス)のメンバーやコンストラクタへアクセスするために使われる重要なキーワードです。主な役割は以下の3つです。親クラスのインスタンス参照:super変数は、直近の親クラスのインスタンスを参照します。親クラスのメソッド呼び出し:superを使うことで、オーバーライドされた親クラスのメソッドを呼び出せます。親クラスのコンストラクタ呼び出し:super()は親クラスのコンストラクタとして機能し、子クラスのコンストラクタ内では必ず最初の行に記述する必要があります。特に、オーバーライドされたメ

  2. Javaの集約(Aggregation)とは?HAS-A関係の基本をわかりやすく解説

    Javaにおける集約(Aggregation)とは、オブジェクト指向プログラミングにおける「HAS-A関係」を表す概念です。あるクラスが、別のクラスのオブジェクトを「持っている(has-a)」という関係性を指します。まずは具体的な例を見てみましょう。集約のコード例public class Vehicle{} public class Speed{} public class Van extends Vehicle { private Speed sp; }この例では、VanクラスがSpeedクラスのインスタンスをフィールドとして保持しています。つまり、「VanはSpeedを持っている(