修正完了…か?
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; } }