修正完了…か?

id:regasuie:20051026:1130312103のプログラムのテストをしてみた。CheckerTestクラスのfalseを返して欲しいパターンにいくつか追加して動かしてみたところ、2つほどtrueを返してしまったものがあった。



まず、CheckerTestクラスのfalseを返して欲しい項目に次の内容を追加してみた。

callChecker("0.+0", false);
callChecker("12:3", false);
callChecker("12;3", false);
callChecker("12=3", false);
callChecker("1~23", false);
callChecker("12|3", false);
callChecker("1\23", false);
callChecker("123_", false);
callChecker("1!23", false);
callChecker("1/23", false);
callChecker("12,3", false);
callChecker("12)3", false);
callChecker("('", false);
callChecker("22#1", false);
callChecker("1$23", false);
callChecker("1&23", false);
callChecker("1^23", false);
callChecker("12?3", false);
callChecker("1%23", false);
callChecker("1\"23", false);

入力できる記号で試していないのは:;=~^\|_!?#$%&'(),"の19種類だし、ならそれ全部試そうかってことで適当に入力させてみた。結果…

「12:3」を渡したところ、「true」が返されました。「false」が返されるようにしてほしいな。
「1/23」を渡したところ、「true」が返されました。「false」が返されるようにしてほしいな。

あ、あれ? 何で通らないんだ…?
確認の為、次のソースを追加してみる。

System.out.println("取得文字の長さは" + chklng);
System.out.println("取得文字は" + value.charAt(g));
System.out.println("取得文字のシーケンス値は" + chkbt[g]);

最初、:と/は取得されてないのかと思ったけどそんなことは無く。ただ/は47、:は58だってことが判明した…ってことは最初のif条件か。

if (chkbt[g] > 58 || chkbt[g] < 47) {
}

今、こうなってる。取得したシーケンス値が59以上か46以下の場合に次の処理を実行するように設定してる…つまり47〜58の場合スルーされるわけだ。そして数字0〜9のシーケンス値は47〜58…あれ、47〜58だと12個あるな。48〜57の間違いか…ってことはこうすれば。

if (chkbt[g] > 57 || chkbt[g] < 48) {
}

これでシーケンス値が48〜57の場合、つまり0〜9の場合にスルーされるようになるはず。
テスト実行…何も表示されない。成功!


ってことでこれで完成ということで良いのかな…それともテストパターンをもっと増やすべきなんだろか?
修正版を一応、記載。

public class Checker {
	/**
	 * 正しく数字が入力されたことを判断するプログラム ver.0.011
	 * getBytes()で取得するバイトシーケンスの符号
	 * 43 = +
	 * 45 = -
	 * 46 = .
	 * 48〜57 = 0〜9
	 */
	public static boolean isNumber(String value) {
		// null値の判定処理
		if (value == null || value.length() == 0) {
			return true;
		}
		// 変数の宣言
		int chklng = value.length();
		boolean judge = true;
		int dotcount = 0;
		// 文字をbyte配列にて取得
		byte chkbt[] = value.getBytes();
		// 判定処理
		for (int g = 0; g < chklng; g++) {
			// 0〜9であればif以下の処理をスルー
			if (chkbt[g] > 57 || chkbt[g] < 48) {
				if (chkbt[g] == 43 && g == 0) {
					// +が先頭にあればtrueとする
					judge = true;
				} else if (chkbt[g] == 45 && g == 0) {
					// -が先頭にあればtrueとする
					judge = true;
				} else if (chkbt[g] == 46) {
					// 小数点を数える
					dotcount++;
					if (g > 0 && g < chklng - 1) {
						// 小数点が先頭・末尾に無ければtrueとする
						judge = true;
					} else {
						// 他はfalseに変更
						judge = false;
					}
				} else {
					// +でも-でも.でもなければfalseとする
					judge = false;
				}
			}
			if (dotcount > 1) {
				// 小数点が1個以上存在した場合falseとする
				judge = false;
			}
		}

		return judge;
	}
}