悩んで悩んで
昨日からずっとこことにらめっこしてるけど、どのメソッドを使えばいいのかわからない。基礎知識が不足してて気づけないんじゃないのかって気がふつふつと…一度これに関しては置いておくことにしようかな。
現在の状況はこんな感じ。
public class Checker { // 正しく数字が入力されたことを判断するプログラム ver.0.009 public static boolean isNumber(String value) { // null値の判定処理 if (value == null || value.length() == 0) { return true; } // 変数の宣言 int chklng = value.length(), dot1 = value.indexOf("."), dot2 = value.lastIndexOf("."), plus = value.lastIndexOf("+"), minus = value.lastIndexOf("-"); boolean judge = true; // 判定処理 if (dot1 == 0 || dot2 == chklng - 1) { return false; } if (dot1 != dot2) { return false; } if (plus > 0 || minus > 0) { return false; } for (int i = 0; i < chklng; i++) { judge = Character.isDigit(value.charAt(i)); // System.out.println(value.charAt(i) + "は" + judge + "です"); if (!judge) { if (i == dot1 || i == plus || i == minus) { // System.out.println("judgeをtrueにします"); judge = true; } else { // System.out.println(judge + "を返します"); return judge; } } } // System.out.println(judge + "を返します"); return judge; } }
コメントアウトしてるところは確認のために追記した分。
○結果
「123456」を渡したところ、「true」が返されました。「false」が返されるようにしてほしいな。
今回でわかったのは、isDigit()は半角と全角の数字に対してtrueを返すってこと。
さて、ここまでの判定方法に問題が無ければいいんだけど。
解けた!(多分!)
これでどうだー!
public class Checker { // 正しく数字が入力されたことを判断するプログラム ver.0.010 /** * getBytes()で取得するバイトシーケンスの符号 * 43 = + * 45 = - * 46 = . * 47〜58 = 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] > 58 || chkbt[g] < 47) { 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; } }
CheckerTest(id:syunduel:20051014参照)を実行してみたところ、期待通りの結果が返ってきた。
随分かかったけど、これで完成っ
ただ自分では処理速度について全くわからないので、そこだけが気になる…