DecimalFormatクラス

広告

DecimalFormatはNumberFormatクラスの実装クラスで、より細かいフォーマットを指定できます。

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

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

public class DecimalFormat extends NumberFormat

コンストラクタは3つ用意されています。

コンストラクタ
DecimalFormat()
デフォルトロケールに対して、デフォルトのパターンと記号を使って DecimalFormat を作成します。
DecimalFormat(String pattern)
デフォルトロケールに対して、指定されたパターンと記号を使って DecimalFormat を作成します。
DecimalFormat(String pattern, DecimalFormatSymbols symbols)
指定されたパターンと記号を使って DecimalFormat を作成します。

コンストラクタではパターンを指定します。2番目のコンストラクタを見てみます。

public DecimalFormat(String pattern)

デフォルトロケールに対して、指定されたパターンと記号を使って DecimalFormat
を作成します。これは、国際化が主要な問題でない場合は、DecimalFormat を
得るためには簡単な方法です。 

指定されたロケールに対する標準フォーマットを得るには、getNumberInstance
など、NumberFormat のファクトリメソッドを使用してください。これらの
ファクトリメソッドは、指定されたロケールに対する NumberFormat の最適
なサブクラスを返します。 

パラメータ:
  pattern - 非地域対応のパターン文字列 
例外: 
  NullPointerException - pattern が null の場合 
  IllegalArgumentException - 指定されたパターンが正しくない場合

パターンの具体的な記述方法ですが、下記の規則に従って記述します。

記号位置地域対応の有無意味
0数値あり数字
#数値あり数字。ゼロだと表示されない
.数値あり数値桁区切り子または通貨桁区切り子
-数値ありマイナス記号
,数値ありグループ区切り子
E数値あり科学表記法の仮数と指数を区切る。接頭辞や接尾辞内に引用符を付ける必要はない
;サブパターン境界あり正と負のサブパターンを区切る
%接頭辞または接尾辞あり100 倍してパーセントを表す
\u2030接頭辞または接尾辞あり1000 倍してパーミル値を表す
\u00A4接頭辞または接尾辞あり通貨記号で置換される通貨符号。2 つの場合は、国際通貨記号で置換される。パターン内にある場合は、数値桁区切り子ではなく、通貨桁区切り子が使用される
'接頭辞または接尾辞なし接頭辞や接尾辞内の特殊文字を引用符で囲む場合に使用される。たとえば、"'#'#" を使用すると 123 は "#123" にフォーマットされる。単一引用符自体を作成するために合は、1 行に 2 つ引用符を使用する ("# o''clock")

基本的なパターン

基本は"0"と"#"と"."と","の組み合わせです。"#"で表した部分は数値があれば数値を無ければ何も表示しません。"0"で表した部分は数値があれば数値を、数値がなければ0を表示します。"."は小数点の位置を表し、","を使えばカンマ区切りをつけます。

実際の使い方とパターン毎の結果については例えば下記のようになります。

double number = 1234.567d;
DecimalFormat df1 = new DecimalFormat("######");

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

ここで使ってるformatメソッドは親クラスのNumberFormatクラスで用意されているformatメソッドを使っています。

パターン毎の結果

DecimalFormat("######")          1235
DecimalFormat("###,###")         1,235
DecimalFormat("000,000")         001,235
DecimalFormat("000,000.####")    001,234.567
DecimalFormat("000,000.0000")    001,234.5670

のような結果となります。

負の値のパターンの指定

デフォルトでは負の値には"-"が付きますが、負の値の場合のフォーマットを指定することもできます。

負の値の場合のフォーマットを指定するには、間に";"を入れて2つのパターンを指定しておきます。例えば負の値の場合には"-"を接頭語として付ける代わりに全体を()でくくる場合には下記のようになります。

double number = -1234.567d;
DecimalFormat df1 = new DecimalFormat("#,##0.00;(#,##0.00)");

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

実際の値で試してみると、下記のようになります。

import java.text.DecimalFormat;

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

    double number1 = 1234.567d;
    double number2 = -1234.567d;
    DecimalFormat df1 = new DecimalFormat("#,##0.00;(#,##0.00)");
    DecimalFormat df2 = new DecimalFormat("#,##0.00;-#,##0.00");

    System.out.println(df1.format(number1));
    System.out.println(df1.format(number2));
    System.out.println(df2.format(number1));
    System.out.println(df2.format(number2));
  }
}

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

1,234.57
(1,234.57)
1,234.57
-1,234.57

パーセントと通貨記号

パターンの指定で"%"を指定すると、100倍した値でパーセント表示されます。また接頭語に"\u00A4"を指定すると通貨記号が付けられます。

実際に試してみましょう。

import java.text.DecimalFormat;

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

    double number1 = 0.34d;
    double number2 = 123456d;
    DecimalFormat df1 = new DecimalFormat("##0%");
    DecimalFormat df2 = new DecimalFormat("\u00A4#,##0.00");

    System.out.println(df1.format(number1));
    System.out.println(df2.format(number2));
  }
}

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

34%
¥123,456.00

メソッドでのパターン指定

パターンはコンストラクタで指定する以外にapplyPatternメソッドでも指定が可能です。

public void applyPattern(String pattern)

指定されたパターンをこの Format オブジェクトに適用します。パターンと
は、各種のフォーマット特性に対する簡略仕様です。これらの特性は、各設
定機能メソッドで個別に変更することもできます。 

このルーチンで設定される整数の桁数に制限はありません。これは、一般な
エンドユーザの要望であるためです。実際の値を設定したい場合は、setMaximumInteger
を使用してください。負の数値の場合は、セミコロンで区切った 2 つ目のパ
ターンを使用します。 

例: "#,#00.0#" -> 1,234.56 

これは、最小 2 桁の整数、1 つの小数点、最大 2 桁の小数を意味します。 

例: "#,#00.0#;(#,#00.0#)" (負の数値は括弧で囲む) 

負のパターンでは、最小と最大の桁数は無視されます。これらは、正のパタ
ーンで設定されるものと見なされます。 

例外: 
  NullPointerException - pattern が null の場合 
  IllegalArgumentException - 指定されたパターンが正しくない場合

使い方はコンストラクタで指定する場合と同じです。

桁数の制限

整数部分や少数部分の桁数を制限する場合には、NumberFormatクラスと同様に、

setMaximumFractionDigits  数値の小数部分の最大桁数を設定します
setMaximumIntegerDigits   数値の整数部分の最大桁数を設定します
setMinimumFractionDigits  数値の小数部分の最小桁数を設定します
setMinimumIntegerDigits   数値の整数部分の最小桁数を設定します

の各メソッドを使って指定して下さい(詳細はNumberFormatクラスをご覧下さい)。

実際の使い方

DecimalFormatクラスはコンストラクタを使って直接インスタンスを作成することもできますが、NumberFormatクラスのファクトリメソッドを使って作成したインスタンスをキャストして使った方がいいかもしれません。その場合の記述方法は下記のようになります。

import java.text.NumberFormat;
import java.text.DecimalFormat;

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

    double number = 123456d;

    DecimalFormat df = (DecimalFormat)NumberFormat.getNumberInstance();
    df.applyPattern("#,##0");

    System.out.println(df.format(number));
  }
}

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

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