三十一日目はかなり凹みつつ

何故凹んでるのかはid:regasuie:20051013のコメント欄を参照のこと…何故気づかなかったのか…orz



今度はちゃんと動いたっぽい

よく考えたら数字に変換できないというエラーが検出された場合と、検出されない場合の判別ができたらそれでいいんだよな。いちいち抽出した数字を0〜9と比較していずれかと一致するかなんて処理させる必要ないわけで…ってことで一応の完成。

public class Checker {
//正しく数字が入力されたことを判断するプログラム ver.0.002
 public static boolean isNumber(String value)
 {
	 String chkstr = value;
	 int chklng = chkstr.length();
	 boolean chk = true;
	 String chkno;
	 int flag = 0;
	 
	 for(int i=0; i < chklng; i++)
	 {
	   chkno = chkstr.substring(i,(i+1));
		 try{
		 int ichk = Integer.parseInt(chkno);
			 flag++;
		 }
		 catch(NumberFormatException e){
			 flag--;
		 }
	  }
	 if(flag == chklng)
	 {
		 chk = true;
	 }
	 else
	 {
		 chk = false;
	 }
	 return chk;
	 }
}

いちおう思ったとおりの処理はできたと思う。処理の順番としては…

  1. 引数で受け取った文字列の1文字目を抽出する
  2. 抽出した文字(String型)をInt型に変換する
  3. エラーが発生した場合、変数flagの値を1減らす
  4. エラーが発生しなかった場合、変数flagの値を1増やす
  5. 項目2〜4の処理を引数で受け取った文字列の文字数回だけ繰り返す
  6. 変数flagの値と文字列の文字数を比較する
  7. flag=文字数の場合、変数chkをtrueとする
  8. 項目7以外の結果を得た場合、変数chkをfalseとする
  9. 変数chkを戻り値として戻す

こんな感じ。だけどもう少し簡単にできることに気づかせてもらったので、また少しいじったものを記載する。

public class Checker {
//正しく数字が入力されたことを判断するプログラム ver.0.003
 public static boolean isNumber(String value)
 {
	 String chkstr = value;
	 int chklng = chkstr.length();
	 String chkno;
	 
	 for(int i=0; i < chklng; i++)
	 {
	   chkno = chkstr.substring(i,(i+1));
		 try{
		   int ichk = Integer.parseInt(chkno);
		   System.out.println(ichk);
		  }
		 catch(NumberFormatException e){
		   return false;
		 }
	  }
	 return true;
  }
}

上と比べてかなりスッキリしたと思う。まずboolean型の変数を宣言する必要って無いのね…boolean型の戻り値が必要なだけで、変数にあてはめて戻してやる必要は無いみたい。
そして上のやつだと例えば「12345b789」とか入力されたとして、6回目の処理でエラーが発生しているにも関わらず、最後まで確認処理を行ってからでないと判定結果を得られなかったんだけど…ぶっちゃけエラー発生後に処理続けても無駄なのね。
エラーが発生した時点でfalseを戻してやる、一度も発生しなければ最終的にtrueを戻してやる。
これで良さそうだ…というわけでこのver.0.003で完成とするっ

Checkerクラスの使用例

こちらも少しいじってみたので、いちおう記載しておく。

import java.io.*;
public class CheckerTest {

  public static void main(String[] args) throws IOException
  {
	System.out.println("数字を入力して下さい");
	
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	String text = br.readLine();
	
	boolean test = Checker.isNumber(text);
	if(test == true)
	{
	  System.out.println("入力された値は" + text + "です");
	}
	else
	{
	  System.out.println("数字以外の入力は受け付けません");
	}
  }
}