More than 1 year has passed since last update.

概要

金額をカンマ区切りで表示するケースはよくあると思います。

しかし、私の担当している案件で原価が小数となる場合で、その金額をカンマ区切りで表示してほしいという要望があったので、やり方をメモっておきます。

実装

基本は、DecimalFormatを使います。

/**
 * 小数を金額表示のためのカンマ区切り文字列に変換する
 * 小数部は第一位までを含める(第二位以下は切捨)
 * @param val 変換したい小数
 */
public static String convertCommaSeparatedString(double val) {
    return new DecimalFormat("#,##0.0").format(val);
}

コンストラクタで指定したフォーマット文字列ですが、基本は、

  • #: 数字。ゼロだと表示しない
  • 0: 数字。ゼロでも表示する

となり、#,##0.0
は、

  • 小数第一位まで表示(第一位が0でも0を表示する)
  • 整数の一桁目が0であっても、0を表示する
  • 三桁ごとに,で区切るようにする

を意味します。

応用

先のサンプルでは「第二位以下は切捨」としていましたが、「第二位で四捨五入」して欲しいという要望があったとしましょう。

その場合、DecimalFormatだけで対応するのは無理なので、予め丸め処理をして先の関数を使う必要があります。

/**
 * 小数を第二位で四捨五入した値を返す
 * @param val 変換したい小数
 */
public static double round(double val) {
    BigDecimal bd = new BigDecimal(val);
    return bd.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
}

こういう丸め関数を準備し、

double cost = 123.45;
String label = convertCommaSeparatedString(round(cost));

こういう使い方をすればいいでしょう。