[Java] 数字フォーマット(お金表示及び小数点以下表示)


Devlopment note / Java    作成日付 : 2020/02/28 03:00:00   修正日付 : 2020/02/28 03:00:00

こんにちは。明月です。


この投稿はJavaで数字フォーマット(お金表示及び小数点以下表示)に関する説明です。


プログラム内で数字を扱う時にお金表示、つまり千単位でコンマがある表示を設定することが必要な時があります。

お金の場合は「0」が多い数字値だし、コンマ(,)表示がなければ迷う単位が多いからよく使うフォーマット変換だと思います。


Javaは「int」や「double」、「float」タイプを「String」タイプに変換する時には「DecimalFormat」クラスを利用します。

import java.text.DecimalFormat;	

public class Main {
  // 実行関数
  public static void main(String[] args) {	
    // お金表示 (3桁ずつ「,」を表示する。)
    DecimalFormat formatter = new DecimalFormat("#,##0");
    // intタイプ
    int data = 1000000000;
    // intタイプからStringタイプにフォーマットによって変換
    String ret = formatter.format(data);
    // コンソール出力
    System.out.print("#,##0 - ");
    // 結果は1,000,000,000
    System.out.println(ret);

    // 小数点以下2桁まで表示(小数点以下がない場合、0.00で表示する。)
    DecimalFormat formatter2 = new DecimalFormat("#,##0.00");
    // doubleタイプ
    double data2 = 10000000d;
    // doubleタイプからStringタイプにフォーマットによって変換
    ret = formatter2.format(data2);
    // コンソール出力
    System.out.print("#,##0.00 - ");
    // 結果は10,000,000.00 (小数点以下が表示する。)
    System.out.println(ret);

    // 小数点以下2桁まで表示(小数点以下がない場合には表示しない。)
    DecimalFormat formatter3 = new DecimalFormat("#,##0.##");
    // doubleタイプからStringタイプにフォーマットによって変換
    ret = formatter3.format(data2);
    // コンソール出力
    System.out.print("#,##0.## - ");
    // 結果は1,000,000,000 (小数点以下が表示しない。)
    System.out.println(ret);

    // doubleタイプ
    double data3 = 1000.123d;
    // doubleタイプからStringタイプにフォーマットによって変換
    ret = formatter2.format(data3);
    // コンソール出力
    System.out.print("#,##0.00 - ");
    // 結果は1,000.12
    System.out.println(ret);	

    // doubleタイプからStringタイプにフォーマットによって変換
    ret = formatter3.format(data3);
    // コンソール出力
    System.out.print("#,##0.## - ");
    // 結果は1,000.12
    System.out.println(ret);

    // doubleタイプ
    double data4 = 1000.1d;
    // doubleタイプからStringタイプにフォーマットによって変換
    ret = formatter2.format(data4);
    // コンソール出力
    System.out.print("#,##0.00 - ");
    // 結果は1,000.10 (小数点以下が1桁だけとフォーマットが2桁までなければ0なので表示する。)
    System.out.println(ret);

    // doubleタイプからStringタイプにフォーメットによって変換する。
    ret = formatter3.format(data4);
    // コンソール出力
    System.out.print("#,##0.## - ");
    // 結果は1,000.10
    System.out.println(ret);
  }
}


上の例で「#」はあれば表示するし、なければ表示しないことだし、「0」はなかったらデフォルトで「0」を表示するということでフォーマット設定になります。

そうすれば、上は小数点2桁までの設定でしだが、3桁になるとどうなるでしょうか?

public class Main {
  public static void main(String[] args) {
    // フォーマット設定
    DecimalFormat formatter = new DecimalFormat("#,##0.##");
    // doubleタイプで小数点3桁設定
    double data2 = 0.127d;
    // doubleタイプからStringタイプにフォーマットによって変換する。
    String ret = formatter.format(data2);
    // コンソール出力
    System.out.println(ret);
  }
}


四捨五入になって「0.127」から「0.13」になりました。

でも、状況によって四捨五入じゃなく、切り捨てする時もあります。その時にはフォーマットだけじゃなく、Mathクラスを利用して計算するか、BigDecimalタイプに変換して切り捨て関数で計算するかの方法があります。

import java.math.BigDecimal;
import java.text.DecimalFormat;

public class Main {
  public static void main(String[] args) {
    // フォーマット設定
    DecimalFormat formatter = new DecimalFormat("#,##0.##");
    // doubleタイプで小数点3桁設定
    double data = 0.127d;
    // データを100を乗算して小数点以下を切り捨てする。
    // そのデータからまた100を割算する。
    double data2 = Math.floor(data * 100) / 100;
    // doubleタイプからStringタイプにフォーマットによって変換
    String ret = formatter.format(data2);
    // コンソール出力
    System.out.println(ret);

    // doubleタイプをBigDecimalタイプに変換する。
    BigDecimal data3 = new BigDecimal(data);
    // 小数点2桁まで切り捨てする。
    data3 = data3.setScale(2, BigDecimal.ROUND_DOWN);
    // BigDecimalタイプからStringタイプにフォーマットによって変換
    ret = formatter.format(data3);
    // コンソール出力
    System.out.println(ret);
  }
}


個人的にBigDecimalを使うとメモリ使用がありますが、Math.floorの場合はoverflowエラー可能性があるので、BigDecimalタイプに変換して切り捨てする方が良いと思います。


ここまでJavaで数字フォーマット(お金表示及び小数点以下表示)に関する説明でした。


ご不明なところや間違いところがあればコメントしてください。

最新投稿