« Java:JPEGファイルから画像サイズのみ読み込む | トップページ | Java:数値を3桁ごとのカンマ区切りの文字列にする »

Java:全角の数値文字列を数値として受け付ける

【課題】
ユーザが入力を行う場合,数値は文字列として入力フィールドに入力され,この文字列は内部で処理するためにどこかで数値に変換する処理が必要になるかと思います。
今回は,数値文字列をBigDecimalに変換する処理をJavaで作成してみます。
この変換には以下の2つの処理も含めることにします。
1)全角の数値文字列もBigDecimalに変換できるようにしてみます。
2)ユーザが数値入力するとき,慣習的に3桁ごとにカンマを入れて入力する場合がありますが,数値に変換する前にこれを取り除くことでカンマの入力を許容します。


【概要】
●入力文字列に対する事前処理
BigDecimalのコンストラクタは,文字列を受け取ると,これを数値として解釈しようとします。
コンストラクタに渡される数値文字列について,数字以外は以下のように解釈します。そのためユーザプログラムは以下の事前処理を行う必要はありません。
・文字列の先頭が「-」の場合は負の値として読み込む。「+」の場合は「+」を読み飛ばす。
・文字列の先頭(先頭が「+」「-」のときは次の文字)がピリオドの場合は前にゼロを補完する。
・文字列の最後がピリオド(小数点)で終わっていたら,小数点を無視する。

以上より,BigDecimalのコンストラクタに渡す入力文字列には,上記で行われない以下の事前処理が必要になります。
・半角及び全角の数字を半角に揃える。
・半角及び全角のマイナス,プラス,ピリオドを半角に揃える。
・半角及び全角のカンマは読み飛ばす。
・それ以外の文字が出現したら,NumberFormatException例外にする。

●半角及び全角の数字の扱い
文字が数字かどうかの判定は,CharacterクラスのisDigit()メソッドを使用します。
このメソッドは半角及び全角の数字を与えるとtrueを返します。
数字の数値への変換は,Characterクラスのdigit()メソッドを使用します。
このメソッドは半角及び全角の数字を与えると,これを数値に変換します。
この2つのメソッドにより,全角半角の区別なく数字を数値に置き換えることができます。

【実装】
概要から,具体的なコードは以下のようになります。

●事前処理

  //-----------------------------------------------------------------------
  private static final char CHAR_ZEN_MINUS = 0xFF0D;
  private static final char CHAR_ZEN_PLUS = 0xFF0B;
  private static final char CHAR_ZEN_PERIOD = 0xFF0E;
  private static final char CHAR_ZEN_COMMA = 0xFF0C;
  //-----------------------------------------------------------------------
  /**
   * 事前処理:数値を表現する全角文字を半角に置き換える。カンマは読み飛ばす.
   * @param numStr 入力文字列.
   * @return 置き換えを行った入力文字列.
   * @throws NumberFormatException 数値を表現する文字以外の文字が含まれていた.
   */
  public static String buildNumString (
    String numStr)
    throws NumberFormatException
  {
    String result = "0";
    if (numStr != null && !numStr.isEmpty()) {
      StringBuilder buff = new StringBuilder();
      char[] chars = numStr.toCharArray();
      for (char numChar : chars) {
        if (Character.isDigit(numChar)) {
          buff.append(Character.digit(numChar, 10));
        }
        else if (numChar == '-' || numChar == CHAR_ZEN_MINUS) {
          buff.append('-');
        }
        else if (numChar == '+' || numChar == CHAR_ZEN_PLUS) {
          buff.append('+');
        }
        else if (numChar == '.' || numChar == CHAR_ZEN_PERIOD) {
          buff.append('.');
        }
        else if (numChar != ',' && numChar != CHAR_ZEN_COMMA) {
          throw new NumberFormatException("数値表現に誤りがあります:"+numStr);
        }
      }
      result = buff.toString();
    }
    return result;
  }
※上記コードでは,整形のため空白部分は全角スペースを使用しています。

●BigDecimalへの変換
事前処理の結果をコンストラクタに渡してBigDecimalのインスタンスを作ります。

import java.math.BigDecimal;
  //-----------------------------------------------------------------------
  /**
   * 入力文字列を事前処理して,その結果からBigDecimalを作成.
   * @param args 入力文字列.
   */
  public static void main(String[] args)
  {
    try {
      String numStr = args[0];
      String str = buildNumString(numStr);
      BigDecimal dec = new BigDecimal(str);
      System.out.println(dec.toString());
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }
※上記コードでは,整形のため空白部分は全角スペースを使用しています。
【著作権表記】上記コードを含む本ブログのプログラムコードは,私的利用可,商用利用可,改変しての利用可です。利用の際に作者に許諾を得る必要はありません。

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



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


ioPLAZA【DVDミレル】

|

« Java:JPEGファイルから画像サイズのみ読み込む | トップページ | Java:数値を3桁ごとのカンマ区切りの文字列にする »

Java」カテゴリの記事

トラックバック


この記事へのトラックバック一覧です: Java:全角の数値文字列を数値として受け付ける:

« Java:JPEGファイルから画像サイズのみ読み込む | トップページ | Java:数値を3桁ごとのカンマ区切りの文字列にする »