« Java:全角の数値文字列を数値として受け付ける | トップページ | Java:前回作成したコードの処理速度を比較する »

Java:数値を3桁ごとのカンマ区切りの文字列にする

【課題】
前回は数値文字列を数値に変換してBigDecimalを生成しましたが,今回はその逆を行います。
BigDecimalクラスの数値を3桁ごとにカンマで区切った数値文字列に変換します。
また,小数点を含む値についても対応します。
ただ,整数値の場合はStringクラスのformatメソッドを使って以下のように書くことで実現できてしまいます。
仕事でプログラミングを行っている人で,これで要求を満たすならこちらを使いましょう。

BigDecimal dec = new BigDecimal("12345678");
long value = dec.longValue();

String valueStr = String.format("%1$,3d", value);

System.out.println(valueStr);

次回記事にて上記コードと下記コードの速度比較を行っています。

【概要】
カンマの挿入は,少数点以上は下の桁から数えて3桁ごとに挿入する必要があります。
逆に小数点以下は,上の桁から3桁ごとにカンマを挿入します。
これを行うロジックはいくつか考えられますが,今回は以下の手順で行います。

(1)BigDecimalの値を文字列化して,数値文字列を小数点で区切って2つに分ける。
(2)少数点以上の数値文字列を文字配列に変換する。
(3)文字配列の最後(下の桁)から数字を1文字づつ取り出しStringBuilderに追加する。同時に3文字ごとにカンマを入れる。
※このときのStringBuilderの内容は,下の桁→上の桁の順に数字が並んでいます。
(4)負の値の場合は最後にマイナスを追加する。
(5)StringBuilderの内容をreverse()メソッドで反転させる。
※以降は小数点以下の桁があった場合の処理です。
(6)StringBuilderに小数点を挿入する。
(7)((1)で作成した)小数点以下の数値文字列を文字配列に変換する。
(8)文字配列の最初(上の桁)から数字を1文字づつ取り出しStringBuilderに追加する。同時に3文字ごとにカンマを入れる。
(9)StringBuilderの内容を文字列に変換する。

【実装】
上記手順をコードにすると以下のようになります。

import java.math.BigDecimal;

  //------------------------------------------------------------------
  /**
   * 動作確認用mainメソッド.
   */
  public static void main(String[] args)
  {
    BigDecimal dec = new BigDecimal("-12345678.9012345");
    String str = decimalToString(dec);
    System.out.println(str);
  }
  //------------------------------------------------------------------
  /**
   * BigDecimalを数値文字列に変換.
   * @param dec 変換するBigDecimal値.
   * @return 変換した文字列.
   */
  private static String decimalToString (
    BigDecimal dec)
  {
    String valueStr = String.valueOf(dec.toString());
    String[] valueStrs = valueStr.split("[.]");

    StringBuilder buff = new StringBuilder(valueStr.length());

    if (0 < valueStrs.length && !valueStrs[0].isEmpty()) {
      char[] chars = valueStrs[0].toCharArray();
      boolean isnegative = (0 < dec.scale());
      int lastindex = (isnegative)? 1: 0;
      int count = 1;
      for (int index = chars.length-1; lastindex <= index; index--) {
        buff.append(chars[index]);
        if (count++ % 3 == 0) {
          buff.append(',');
        }
      }
      if (',' == buff.charAt(buff.length()-1)) {
        buff.setLength(buff.length()-1);
      }
      if (isnegative) {
        buff.append("-");
      }
      buff.reverse();
    }

    if (1 < valueStrs.length && !valueStrs[1].isEmpty()) {
      buff.append(".");
      char[] chars = valueStrs[1].toCharArray();
      int count = 1;
      for (char c : chars) {
        buff.append(c);
        if (count++ % 3 == 0) {
          buff.append(',');
        }
      }
      if (',' == buff.charAt(buff.length()-1)) {
        buff.setLength(buff.length()-1);
      }
    }
    return buff.toString();
  }

※上記コードでは,整形のため空白部分は全角スペースを使用しています。
【著作権表記】上記コードを含む本ブログのプログラムコードは,私的利用可,商用利用可,改変しての利用可です。利用の際に作者に許諾を得る必要はありません。

■関連書籍をAmazonで検索:[Java]
増補改訂版 Java言語で学ぶデザインパターン入門(kindle版)



にほんブログ村 IT技術ブログへ にほんブログ村 IT技術ブログ プログラム・プログラマへ 人気ブログランキングへ ←この記事が役に立ったという方はクリックお願いします。


ソニーストア

|

« Java:全角の数値文字列を数値として受け付ける | トップページ | Java:前回作成したコードの処理速度を比較する »

Java」カテゴリの記事

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/505963/61216563

この記事へのトラックバック一覧です: Java:数値を3桁ごとのカンマ区切りの文字列にする:

« Java:全角の数値文字列を数値として受け付ける | トップページ | Java:前回作成したコードの処理速度を比較する »