[Java] 数値のフォーマット処理 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

数値のフォーマット処理についてメモしておきます。


数値(10進数)のフォーマット処理には Java.text パッケージの NumberFormat クラスを使用します。


NumberFormat クラスには汎用的なフォーマットのインスタンスを生成する数種類のファクトリメソッドが用意されており、これらを使用してフォーマット処理を行うのが簡単です。


汎用数値フォーマットによるフォーマット処理

getNumberInstance() を使用すると、汎用数値フォーマットによるフォーマット処理が行えます。

String value = "123456.789";
NumberFormat df = NumberFormat.getNumberInstance();
System.out.println(value + " --> " + df.format(new BigDecimal(value)));

123456.789 --> 123,456.789


整数型数値フォーマットによるフォーマット処理

getIntegerInstance() を使用すると、整数型数値フォーマットによるフォーマット処理が行えます。

String value = "123456.789";
NumberFormat df = NumberFormat.getIntegerInstance();
System.out.println(value + " --> " + df.format(new BigDecimal(value)));

123456.789 --> 123,457


通貨フォーマットによるフォーマット処理

getCurrencyInstance() を使用すると、通貨フォーマットによるフォーマット処理が行えます。

String value = "123456.789";
NumberFormat df = NumberFormat.getCurrencyInstance();
System.out.println(value + " --> " + df.format(new BigDecimal(value)));

123456.789 --> ¥123,457


パーセントフォーマットによるフォーマット処理

getPercentInstance() を使用すると、パーセントフォーマットによるフォーマット処理が行えます。

String value = "0.123";
NumberFormat df = NumberFormat.getPercentInstance();
System.out.println(value + " --> " + df.format(new BigDecimal(value)));

0.123 --> 12%


カスタムフォーマットによるフォーマット処理

NumberFormat クラスのサブクラス DecimalFormat を使用すると、カスタムフォーマットによるフォーマット処理が行えます。

String value = "123456789";
DecimalFormat df = new DecimalFormat("#,##0.0");
System.out.println(value + " -- ( " + df.toPattern() + " ) --> " + df.format(new BigDecimal(value)));

123456789 --> 123,456,789.0

フォーマットに指定できるパターンには、

パターン 説明
# 数字。値が0の時は表示しない。
0 数字。値が0の時も表示する。
. 小数点
, 桁区切り文字
% パーセント表示
\u00A4 通貨記号

などがあります。


桁数を指定したフォーマット処理

NumberFormat クラスは整数部、小数部の最小桁数、最大桁数を保持しており、これらの設定に基づいてフォーマット処理が行われます。

これらの変数の既定値はNumberFormatクラスのインスタンスの作成方法によって異なりますが、以下のメソッドを使用すれば、後から変更することができます。

メソッド 説明
setMinimumIntegerDigits(int newValue) 整数部の最小桁数を指定する。
setMaximumIntegerDigits(int newValue) 整数部の最大桁数を指定する。
setMinimumFractionDigits(int newValue) 小数部の最小桁数を指定する。
setMaximumFractionDigits(int newValue) 小数部の最大桁数を指定する。


例えば、最大桁数を指定することによって、溢れた桁を丸めたり、

String value = "123456.789";
DecimalFormat df = new DecimalFormat("#.#");
df.setMaximumIntegerDigits(5);
df.setMaximumFractionDigits(2);
System.out.println(value + "  --> " + df.format(new BigDecimal(value)));

123456.789 --> 23456.79

最小桁数を指定することによって、ゼロ埋めしたりすることができます。

String value = "123456.789";
DecimalFormat df = new DecimalFormat("#.#");
df.setMinimumIntegerDigits(10);
df.setMaximumIntegerDigits(10);
df.setMinimumFractionDigits(5);
df.setMaximumFractionDigits(5);
System.out.println(value + " --> " + df.format(new BigDecimal(value)));

123456.789 --> 0000123456.78900


ロケールを指定したフォーマット処理

通貨記号をつける場合など、ロケールを明示的に指定しなければ既定のロケールに基づいてフォーマット処理が行われますが、以下のようにロケールを明示的に指定すると、指定したロケールに基づいてフォーマット処理が行われます。


NumberFormat クラスのファクトリメソッドを使用する場合

ファクトリメソッドの引数としてロケールを指定します。

String value = "123456.789";
NumberFormat df = NumberFormat.getCurrencyInstance(Locale.US);
System.out.println(value + " --> " + df.format(new BigDecimal(value)));

123456.789 --> $123,456.79

DecimalFormat クラスを使用する場合

デフォルトロケールを変更してからフォーマット処理を行います。

Locale.setDefault(Locale.US);
DecimalFormat df = new DecimalFormat("\u00A4#,##0");
System.out.println(value + " --> " + df.format(new BigDecimal(value)));
Locale.setDefault(Locale.JAPAN);

123456789 --> $123,456,789