NumberFormatクラス

広告

NumberFormatクラスは数値をフォーマットおよび解析する抽象クラスです。実装クラスのDecimalFormatクラスやChoiceFormatクラスも用意されています。

まず下記のクラス図を見てください。

java.lang.Object
  java.text.Format
    java.text.NumberFormat

public abstract class NumberFormat extends Format

NumberFormatクラスはabstractクラスですが、DateFormatクラスと同じようにいくつかのstaticなファクトリメソッドが用意されており、そのメソッドを使ってNumberFormatクラスのオブジェクトを作成することができます。用意されているメソッドは下記の通りです。

メソッドの概要
static NumberFormat getCurrencyInstance()
現在のデフォルトロケールに対する通貨フォーマットを返します。
static NumberFormat getInstance()
現在のデフォルトのロケールに対する汎用数値フォーマットを返します。
static NumberFormat getIntegerInstance()
現在のデフォルトロケールに対する整数型数値フォーマットを返します。
static NumberFormat getNumberInstance()
現在のデフォルトロケールに対する汎用数値フォーマットを返します。
static NumberFormat getPercentInstance()
現在のデフォルトロケールに対するパーセントフォーマットを返します。

通常の数値フォーマットを得るには、getInstance か getNumberInstance を使用します。整数型数値フォーマットを得るには、getIntegerInstance を使用します。通貨数値フォーマットを得るには、getCurrencyInstance を使用します。そして、パーセントを表示するフォーマットを得るには、getPercentInstance を使用します。

NumberFormatクラスを使って数値を文字列に変換する場合の実際の使い方は下記の様になります。

NumberFormat nf = NumberFormat.getNumberInstance();
double number = 1234.56789;

String str = nf.format(number);

ここで使われているformatメソッドは、引数が異なる2つメソッドとしてNumberFormatクラスで下記のように定義されています。

public final String format(double number)

フォーマットの特殊化です。

public final String format(long number)

フォーマットの特殊化です。

上記のようにフォーマットする数値はdouble型かlong型の値となります。

指定可能なフォーマットとしては、数値の整数部分の最大桁数と最小桁数、数値の少数部分の最大桁数と最小桁数、及びカンマ区切りを入れるかどうかです。これらはそれぞれNumberFormatで用意されている次のメソッドを使って指定します。

setGroupingUsed:

public void setGroupingUsed(boolean newValue)

このフォーマットでグループ化を使用するかどうかを設定します。

setMaximumIntegerDigits:

public void setMaximumIntegerDigits(int newValue)

数値の整数部分として可能な最大桁数を設定します。maximumIntegerDigits 
は、minimumIntegerDigits 以上でなければなりません。maximumIntegerDigits 
の新しい値が maximumIntegerDigits の現在の値よりも小さい場合、
minimumIntegerDigits もこの新しい値に設定されます。 

パラメータ:
  newValue - 整数の最大表示桁数。0 より小さい場合は 0 が使用される。具
    象サブクラスでは、この値の上限を、フォーマットされる数値の種類に適
    した値に強制できる

setMinimumIntegerDigits:

public void setMinimumIntegerDigits(int newValue)

数値の整数部分として可能な最小桁数を返します。minimuIntegerDigits は、
maximumIntegerDigits 以下でなければなりません。minimumIntegerDigits 
の新しい値が maximumIntegerDigits の現在の値よりも大きい場合、
maximumIntegerDigits もこの新しい値に設定されます。 

パラメータ:
  newValue - 整数の最小表示桁数。0 より小さい場合は 0 が使用される。具
    象サブクラスでは、この値の上限を、フォーマットされる数値の種類に適
    した値に強制できる

setMaximumFractionDigits:

public void setMaximumFractionDigits(int newValue)

数値の小数部分として可能な最大桁数を設定します。maximumFractionDigits
は、minimumFractionDigits 以上でなければなりません。maximumFractionDigits
の新しい値が minimumFractionDigits の現在の値よりも小さい場合、
minimumFractionDigits もこの新しい値に設定されます。 

パラメータ:
  newValue - 小数点の最大表示桁数。0 より小さい場合は 0 が使用される。
    具象サブクラスでは、この値の上限を、フォーマットされる数値の種類
    に適した値に強制できる

setMinimumFractionDigits:

public void setMinimumFractionDigits(int newValue)

数値の小数部分として可能な最小桁数を設定します。minimumFractionDigits
は、maximumFractionDigits 以下でなければなりません。minimumFractionDigits 
の新しい値が maximumFractionDigits の現在の値よりも大きい場合、
maximumFractionDigits もこの新しい値に設定されます。 

パラメータ:
  newValue - 小数点の最小表示桁数。0 より小さい場合は 0 が使用される。
    具象サブクラスでは、この値の上限を、フォーマットされる数値の種類
    に適した値に強制できる

ではここで実際にJFormattedTextFieldに適用する場合、どのような結果になるのかを試してみます。

import javax.swing.*;
import java.awt.event.*;
import java.awt.FlowLayout;

import java.text.NumberFormat;

public class SwingTest extends JFrame{
  public static void main(String[] args){
    SwingTest test = new SwingTest("SwingTest");

    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    test.setVisible(true);
  }

  SwingTest(String title){
    setTitle(title);
    setBounds( 10, 10, 300, 200);

    double number = 123456.7890123d;
    NumberFormat nf1 = NumberFormat.getNumberInstance();

    System.out.println("少数部分の最大桁数:" + nf1.getMaximumFractionDigits());
    System.out.println("少数部分の最小桁数:" + nf1.getMinimumFractionDigits());
    System.out.println("整数部分の最大桁数:" + nf1.getMaximumIntegerDigits());
    System.out.println("整数部分の最小桁数:" + nf1.getMinimumIntegerDigits());
    System.out.println("グループ化(カンマ区切り)の有無:" + nf1.isGroupingUsed());

    JFormattedTextField ftf1 = new JFormattedTextField(nf1);
    ftf1.setValue(number);

    NumberFormat nf2 = NumberFormat.getNumberInstance();
    nf2.setMaximumFractionDigits(7);
    JFormattedTextField ftf2 = new JFormattedTextField(nf2);
    ftf2.setValue(number);

    NumberFormat nf3 = NumberFormat.getNumberInstance();
    nf3.setMaximumIntegerDigits(3);
    JFormattedTextField ftf3 = new JFormattedTextField(nf3);
    ftf3.setValue(number);

    NumberFormat nf4 = NumberFormat.getNumberInstance();
    nf4.setGroupingUsed(false);
    JFormattedTextField ftf4 = new JFormattedTextField(nf4);
    ftf4.setValue(number);

    JPanel p = new JPanel();
    p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));
    p.add(ftf1);
    p.add(ftf2);
    p.add(ftf3);
    p.add(ftf4);

    getContentPane().setLayout(new FlowLayout());
    getContentPane().add(p);
  }
}

実行結果は下記のようになります。

上記では、まず標準出力にデフォルトで設定されている値を出力しています。結果は下記のようになりました。

少数部分の最大桁数:3
少数部分の最小桁数:0
整数部分の最大桁数:2147483647
整数部分の最小桁数:1
グループ化(カンマ区切り)の有無:true

デフォルトではカンマ区切りがあり、小数部分の最大桁数が3桁となっています。先ほどのサンプルでは、小数部分の最小桁数を増やしてみたり、整数部分の最大桁数を減らしてみたり、最後にカンマ区切りを無しにしてみています。

通貨数値フォーマット

では次に通貨数値フォーマットを試してみます。通貨数値フォーマットを使う場合には、getCurrencyInstanceメソッドを使ってNumberFormatのオブジェクトを作成します。

NumberFormat nf = NumberFormat.getCurrencyInstance();
double number = 1234.56789;

String str = nf.format(number);

デフォルトのロケールの通貨の形式にフォーマットが行われます。
利用する通貨を変更するためのメソッドとして、setCurrencyメソッドが用意されています。

public void setCurrency(Currency currency)

通貨値のフォーマット時に、この数値フォーマットが使用する通貨を設定しま
す。これは、数値フォーマットが使用する最小小数桁数または最大小数桁数を
更新するものではありません。 

デフォルト実装は UnsupportedOperationException をスローします。 

パラメータ:
  currency - この数値フォーマットで使用する新しい通貨 
例外: 
  UnsupportedOperationException - 数値フォーマットのクラスが通貨フォー
    マットを実装しない場合 
  NullPointerException - currency が null の場合

このメソッドの引数であるCurrencyクラスは通貨を表すクラスで、下記のような使い方をします。

NumberFormat nf = NumberFormat.getCurrencyInstance();
nf.setCurrency(Currency.getInstance(Locale.US));

double number = 1234.56789;

String str = nf.format(number);

上記のようにすることで、USのデフォルト通貨を使ってフォーマットすることが可能です。

では実際に試してみます。

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

public class SwingTest{
  public static void main(String[] args){

    double number = 123456.7890123d;
    NumberFormat nf1 = NumberFormat.getCurrencyInstance();

    System.out.println("少数部分の最大桁数:" + nf1.getMaximumFractionDigits());
    System.out.println("少数部分の最小桁数:" + nf1.getMinimumFractionDigits());
    System.out.println("整数部分の最大桁数:" + nf1.getMaximumIntegerDigits());
    System.out.println("整数部分の最小桁数:" + nf1.getMinimumIntegerDigits());
    System.out.println("グループ化(カンマ区切り)の有無:" + nf1.isGroupingUsed());

    System.out.println(nf1.format(number));

    NumberFormat nf2 = NumberFormat.getCurrencyInstance();
    nf2.setCurrency(Currency.getInstance(Locale.US));

    System.out.println("少数部分の最大桁数:" + nf2.getMaximumFractionDigits());
    System.out.println("少数部分の最小桁数:" + nf2.getMinimumFractionDigits());
    System.out.println("整数部分の最大桁数:" + nf2.getMaximumIntegerDigits());
    System.out.println("整数部分の最小桁数:" + nf2.getMinimumIntegerDigits());
    System.out.println("グループ化(カンマ区切り)の有無:" + nf2.isGroupingUsed());
    System.out.println(nf2.format(number));
  }
}

実行結果は下記のようになります。

少数部分の最大桁数:0
少数部分の最小桁数:0
整数部分の最大桁数:2147483647
整数部分の最小桁数:1
グループ化(カンマ区切り)の有無:true
¥123,457

少数部分の最大桁数:0
少数部分の最小桁数:0
整数部分の最大桁数:2147483647
整数部分の最小桁数:1
グループ化(カンマ区切り)の有無:true
USD123,457

上記ではデフォルトのロケールの場合と、ロケールをUSに変更した場合で試しています。

パーセントを表示するフォーマット

次はパーセント表示する場合です。パーセントフォーマットを使う場合には、getPercentInstanceメソッドを使ってNumberFormatのオブジェクトを作成します。

使い方などは今までと同じなので、サンプルで試してみます。

import java.text.NumberFormat;

public class SwingTest{
  public static void main(String[] args){

    double number = 1.234567d;
    NumberFormat nf1 = NumberFormat.getPercentInstance();

    System.out.println("少数部分の最大桁数:" + nf1.getMaximumFractionDigits());
    System.out.println("少数部分の最小桁数:" + nf1.getMinimumFractionDigits());
    System.out.println("整数部分の最大桁数:" + nf1.getMaximumIntegerDigits());
    System.out.println("整数部分の最小桁数:" + nf1.getMinimumIntegerDigits());
    System.out.println("グループ化(カンマ区切り)の有無:" + nf1.isGroupingUsed());

    System.out.println(nf1.format(number));

    NumberFormat nf2 = NumberFormat.getPercentInstance();
    nf2.setMaximumFractionDigits(2);
    System.out.println(nf2.format(number));
  }
}

実行結果は下記のようになります。

少数部分の最大桁数:0
少数部分の最小桁数:0
整数部分の最大桁数:2147483647
整数部分の最小桁数:1
グループ化(カンマ区切り)の有無:true
123%
123.46%

上記ではデフォルトのままの場合と、少数部分の桁数を指定した場合で試しています。

ロケールの指定

ロケールを指定する場合のファクトリメソッドもそれぞれ用意されています。

メソッドの概要
static NumberFormat getCurrencyInstance(Locale inLocale)
指定されたロケールに対する通貨フォーマットを返します。
static NumberFormat getInstance(Locale inLocale)
指定されたロケールに対する汎用数値フォーマットを返します。
static NumberFormat getIntegerInstance(Locale inLocale)
指定されたロケールに対する整数型数値フォーマットを返します。
static NumberFormat getNumberInstance(Locale inLocale)
指定されたロケールに対する汎用数値フォーマットを返します。
static NumberFormat getPercentInstance(Locale inLocale)
指定されたロケールに対するパーセントフォーマットを返します。

使い方は今までの使用方法と基本的には違いはありません。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。