• ベストアンサー

入力値のチェック

値により、各種貨幣の最小枚数を計算するソースを書きました。 入力チェックのメソッド(下記のisHalfNum)をいれたいですが、 タイミングと修正するべきところがわからないです。 教えて頂きたいです。 public static boolean isHalfNum(String str) { if (str == null || !str.matches("^[0-9]+$")) { // 半角数字正規表現に一致しない場合、エラー return false; } return true; } ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 自分が書いたソース: public class Ex { public static final int[] NOTE_TYPES = {10000,5000,1000}; public static final int[] COIN_TYPES = {500,100,50,10,5,1}; public static int getNoteCount(int yen) { int[] countNote = new int[NOTE_TYPES.length]; for (int i = 0; i < NOTE_TYPES.length; i++) { countNote[i] = yen / NOTE_TYPES[i]; //商 yen = yen % NOTE_TYPES[i]; //剰余 if(yen < 1000){ int yen_nokori = yen; } } int samNote = 0 ; for(int i:countNote) samNote +=i; return samNote; } public static int getCoinCount(int yen_nokori) { int[] countCoin = new int[COIN_TYPES.length]; for (int i = 0; i < COIN_TYPES.length; i++) { countCoin[i] = yen_nokori / COIN_TYPES[i]; //商 yen_nokori = yen_nokori % COIN_TYPES[i]; //剰余 } int samCoin = 0 ; for(int i:countCoin) samCoin +=i; return samCoin; } public static void main(String args[]) { int yen = Integer.parseInt(args[0]); int samNote = getNoteCount(yen); int samCoin = getCoinCount(yen_nokori); System.out.println("紙幣:\t" + samNote + "枚"); System.out.println("硬貨:\t" + samCoin + "枚"); } }

  • Java
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

>int yen = Integer.parseInt(args[0]); ここで、args[0]の中に数字以外が入っていると例外になる。 従って、これより前に字類チェックを行う必要がある。 とっ、その前にコマンドラインパラメータを指定せずに実行した 場合はargsは空配列なので、args[0]自体が配列範囲外になる。 public static void main(String args[]) {   String str;   if ( args.length > 0 ) {     str = args[0];   }   else {     ★エラーにするか、標準入力から金額を入力する。→str      以前にコード書いていたよね。   }   if ( ! isHalfNum(str) ) {     ★エラーメッセージ表示     System.exit(1); //ここでプログラムは終了する   }   int yen;   try {     yen = Integer.parseInt(str);   }   catch ( NumberFormatException e ) {     System.out.println("数値が範囲外です");     System.exit(2); //ここでプログラムは終了する   }   ★あとは以前の通り 数値変換だけど、intに入りきらない値だと例外になるので、やはり、 try~catchは必要になる。intの範囲:-2147483648~2147483647 また、正規表現だが、「数字以外を見つけたらアウト」なのでは? よって、以下のようになる。 if (str == null || str.matches("\\D")) {   // 半角数字正規表現に一致しない場合、エラー   return false; } http://java.sun.com/javase/ja/6/docs/ja/api/ 何で\が重なるかは分かるよね。 ※インデントに漢字空白を使っているので、コピペすると、  コンパイルエラーになります。

qiuzhaohua
質問者

お礼

ありがとうございました! 解決しました! 大変助かりました!

その他の回答 (1)

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 public static void main(String args[]) {  if ( isHalfNum(args[0]) ) {   int yen = Integer.parseInt(args[0]);  } } こんな具合でしょうか。 isHalfNumが真の場合は実行する感じです。 ただ、どのようにエラー処理したいかによって入れ方は変わると思います。

qiuzhaohua
質問者

補足

イメージつけましたが、実際やるとエラーがいっぱい出てきました。 入力した値は半角数字の場合は実行、違う場合はエラーメッセージの「半角数値を入力してください」を表示させたいです。 よかったら、具体的に入れた後のソースを教えていただけますか

関連するQ&A

  • コンパイラ通らない

    値により、各種貨幣の最小枚数を計算するソースを書きました。 紙幣の枚数はできましたが、与えられた値から紙幣の分を抜いて、 残りの値はコインの枚数を計算したいですが、下記のソースを コンパイルしたらエラーが出てしまいました。 どうすれば残りの値をコインの枚数を計算するメソッドに渡せるんですか? 教えてください。 public class Ex { public static final int[] NOTE_TYPES = {10000,5000,1000}; public static final int[] COIN_TYPES = {500,100,50,10,5,1}; public static int getNoteCount(int yen) { int[] countNote = new int[NOTE_TYPES.length]; for (int i = 0; i < NOTE_TYPES.length; i++) { countNote[i] = yen / NOTE_TYPES[i]; //商 yen = yen % NOTE_TYPES[i]; //剰余 if(yen < 1000){ int yen_nokori = yen; } } int samNote = 0 ; for(int i:countNote) samNote +=i; return samNote; } public static int getCoinCount(int yen_nokori) { int[] countCoin = new int[COIN_TYPES.length]; for (int i = 0; i < COIN_TYPES.length; i++) { countCoin[i] = yen_nokori / COIN_TYPES[i]; //商 yen_nokori = yen_nokori % COIN_TYPES[i]; //剰余 } int samCoin = 0 ; for(int i:countCoin) samCoin +=i; return samCoin; } public static void main(String args[]) { int yen = Integer.parseInt(args[0]); int samNote = getNoteCount(yen); int samCoin = getCoinCount(yen_nokori); System.out.println("紙幣:\t" + samNote + "枚"); System.out.println("硬貨:\t" + samCoin + "枚"); } }

    • ベストアンサー
    • Java
  • 選択により違う動作を実行する方法

    与えられた値により、下記のように貨幣の枚数を求めるソースを書きました。 /** * 与えられた金額を貨幣にした時の紙幣と硬貨の枚数を算出し、表示する。 * @author zhaohua.qiu * */ public class Ex1 { /** 貨幣タイプの定義 */ /* 紙幣の金種 */ private static final int[] NOTE_TYPES = {10000,5000,1000}; /* 硬貨の金種 */ private static final int[] COIN_TYPES = {500,100,50,10,5,1}; /** * 入力を確認し、結果を表示する * @param arg * @param i 入力したパラメータを格納する変数 */ public static void main(String[] args) { /* コマンドラインパラメータを指定したかのチェック */ if ( ! checkNyuryoku(args) ) { System.out.println("コマンドで金額を入力してください"); System.exit(1); //ここでプログラムは終了する } /* 入力した金額は半角数字かのチェック */ if ( ! isHalfNum(args[0]) ) { System.out.println("半角数値ではありません"); System.exit(2); //ここでプログラムは終了する } /* 入力した数値範囲のチェック */ int yen = 0; try { yen = Integer.parseInt(args[0]);//入力した値をint型に変換 }catch ( NumberFormatException e ) { System.out.println("数値が範囲外です"); System.exit(3); //ここでプログラムは終了する } int sumNote = getMoneyCountByType(yen, NOTE_TYPES); int sumCoin = getMoneyCountByType(yen - getAmountByType(yen, NOTE_TYPES), COIN_TYPES); System.out.println("紙幣:\t" + sumNote + "枚"); System.out.println("硬貨:\t" + sumCoin + "枚"); } /** * コマンドラインパラメータをチェックするメソッド * @param args 判定対象 * @return 結果(true:入力した/false:未入力) */ private static boolean checkNyuryoku(String[] args) { if ( args.length > 0 ) { return true; } return false; } /** * 半角数字正規表現のチェックするメソッド * @param str 判定対象 * @return 結果(true:正常/false:異常) */ public static boolean isHalfNum(String str) { if (str == null || !str.matches("^[0-9]+$")) { return false; } return true; } /** * タイプ別の総金額を取得するメソッド * @param yen 計算する値 * @param types 貨幣のタイプ * @return タイプ別の総金額 */ private static int getAmountByType(int yen, int[] types) { int amount = 0; for (int i : types) { amount += i * Math.floor(yen / i); yen = yen % i; } return amount; } /** * タイプ別の総枚数を取得するメソッド * @param yen 計算する値 * @param types 貨幣のタイプ * @return タイプ別の総枚数 */ private static int getMoneyCountByType(int yen, int[] types) { int countMoney = 0; for (int i : types) { countMoney += Math.floor(yen / i); yen = yen % i; } return countMoney; } } 実行して、枚数を表示した後、続いて「具体的紙幣と硬貨の枚数を表示しますか?_(Y/N)」のように使用者に聞いて、Nを選択した場合プログラムを終了させ、Yを選択した場合は下記のソースを実行し、結果を表示したいです。 public class Ex2 { public static final int[] YEN_TYPES = {10000,5000,1000,500,100,50,10,5,1}; public static int[] getYenCount(int yen) { int[] count = new int[YEN_TYPES.length]; for (int i = 0; i < YEN_TYPES.length; i++) { count[i] = yen / YEN_TYPES[i]; //商 yen = yen % YEN_TYPES[i]; //剰余 } return count; } public static void main(String args[]) { int yen = Integer.parseInt(args[0]); int[] count = getYenCount(yen); for (int i = 0; i < YEN_TYPES.length; i++) { if(count[i] != 0) { System.out.println(YEN_TYPES[i] + "円\t" + count[i] + "枚"); } } } } どうすれば、使用者に入力させ、その入力した値により上記の命令を実行させられますか? 教えてください。

  • ループの正誤

    金種表のソースを書きました。 表示ループのif文(枚数0枚の場合表示しない)を実行しない場合は 正確の結果が出てくれるんですが、 このまま実行したら、たとえば引数は222の場合は 実行した結果は 「100円 2枚」、10円と1円の枚数を表示してくれなっかです。 原因を教えて頂けますか? ループのどこが間違えたのがわかりません… import java.io.*; public class ex1 { public static final int[] YEN_TYPES = {10000,5000,1000,500,100,50,10,5,1}; public static int[] getYenCount(int yen, int[] yentype) { int[] count = new int[yentype.length]; for (int i = 0; i < yentype.length; i++) { count[i] = yen / yentype[i]; //商 yen = yen % yentype[i]; //剰余 } return count; } public static void main(String args[]) throws IOException { int yen = Integer.parseInt(args[0]); int[] count = getYenCount(yen, YEN_TYPES); for (int i = 0; i < YEN_TYPES.length; i++) { if(count[i] == 0) { i++; }else{ System.out.println(YEN_TYPES[i] + "円\t" + count[i] + "枚"); } } } }

    • ベストアンサー
    • Java
  • javaプログラミングの質問です。

    プログラムで数値の奇遇、合計値、最大値までは出せたのですが平均値の出し方がわかりません。 どこに何を入れればいいかを教えてください。お願いします。 public class pazu{ public static void main(String[] args){ int sum =0,saidai; System.out.println("コマンドラインパラメータは"+args.length+"個です"); for(int i=0;i<args.length;i++){ int x=Integer.parseInt(args[i]); if(pazu.is_even(x)) System.out.println(args[i]+"は偶数です"); else System.out.println(args[i]+"は奇数です"); sum+=x; } saidai=pazu.max(args); System.out.println("合計:"+sum); System.out.println("最大:"+saidai); } static boolean is_even(int number){ return number%2==0; } static int max(String[] number){ int max =0; for(int i=0;i<number.length;i++){ if(max<Integer.parseInt(number[i])){ max=Integer.parseInt(number[i]); } } return max; } }

    • ベストアンサー
    • Java
  • プログラムの平均値の出し方。

    プログラムの平均値の出し方。 public class pazu{ public static void main(String[] args){ int sum =0,saidai; System.out.println("コマンドラインパラメータは"+args.length+"個です"); for(int i=0;i<args.length;i++){ int x=Integer.parseInt(args[i]); if(pazu.is_even(x)) System.out.println(args[i]+"は偶数です"); else System.out.println(args[i]+"は奇数です"); sum+=x; } saidai=pazu.max(args); System.out.println("合計:"+sum); System.out.println("最大:"+saidai); } static boolean is_even(int number){ return number%2==0; } static int max(String[] number){ int max =0; for(int i=0;i<number.length;i++){ if(max<Integer.parseInt(number[i])){ max=Integer.parseInt(number[i]); } } return max; } } このプログラムで数値の奇遇、合計値、最大値までは出せたのですが平均値の出し方がわかりません。 どこに何を入れればいいかを教えてください。お願いします。

  • アルゴリズム

    public class A1 { public static void main(String[] args) { int[] dataes = {10, 8, 9, 3, 2, 1, 4, 6, 5, 0}; System.out.println("result index = " + search(dataes, 2)); } public static int search(int[] dataes, int valueToFind) { for (int i = 0; i < dataes.length; i++) { if (dataes[i] == valueToFind) { return i; } } return -1; } } このプログラムのフローチャートを教えてください

    • ベストアンサー
    • Java
  • for文

    質問お願い致します。 これのソースのfor文を一つの文にするにはどのように書いたらよいでしょうか? お願い致します。 //指定された文字列が"a"と"b"の両方を含む場合はtrue、なければfalseを返す public class Mondai { public static void main(String[] args) { System.out.println("解答 :" + charBothContain("Habllow")); } public static boolean charBothContain(String str) { boolean answer1 = false; boolean answer2 = false; for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c == 'a') { answer1 = true; break; } } for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c == 'b') { answer2 = true; break; } } return answer1 && answer2; } }

    • ベストアンサー
    • Java
  • コマンドラインで配列0~1番目入力したときは?

    使う言語はJava 例えばこんな感じで入力した場合、コマンドラインの配列0~1番目を入力したときコマンドラインでの配列1番目の文字列を値を出力するにはどうしたらいいのでしょうか? コマンドラインを使ってのサンプルソースがあんまり無かった為質問します。 まだまだ初心者脱却していないのでご指導ご鞭撻のほどお願いします。 お早い回答お待ちしています。 java Sample 2012年 1月 1月 考えたサンプルソースはこうです。 public class Ensyuu158 { /** * @param args */ public static void main(String[] args) { for(int i=0; i<args.length; i++){ if(args[i].equals(args[0])){ methodA(args[0]); }else if(args[i].equals(args[1])){ methodB(args[1]); } } }     //コマンドライン配列0~1番目が入力されたら1番目だけの文字列の値を出力する private static void methodB(String str) { System.out.println(str); }     //コマンドラインでの配列0番目が入力されたら0番目だけの文字列の値と文字列を出力したい private static void methodA(String str) { System.out.println(str+"月"); } } }

  • 最大値と最小値の求め方

    以下はコマンドライン引数で任意の数の整数を受け取って、合計・平均・最大・最小を求めようとしたソースです。 しかし、実行したら最大値と最小値が正しく出ませんでした。 if文が間違っているのかもしれないと思ったのですが、はっきりと『ここが間違っている』という場所が分かりません。 どうかご指摘お願いします。 class Choco { public static void main (String[] args) { int i; int sum = 0; int max; int min; for ( i=0; i<args.length; i++) sum += Integer.parseInt(args[i]); double ave = sum/args.length; max = args.length; min = args.length; if (args.length>max){ max = args.length; } if (args.length<min){ min = args.length; } System.out.println("合計は" + sum + "です。"); System.out.println("平均は" + ave + "です。"); System.out.println("最大値は" + max + "です。"); System.out.println("最小値は" + min + "です。"); } }

    • ベストアンサー
    • Java
  • 入力された入力値と最大値、最小値を表示させるプログラムで、最大値と最小

    入力された入力値と最大値、最小値を表示させるプログラムで、最大値と最小値のプログラムを下記に作成してみたら最小値が0になりました。そして、もう一つ繰り返し文を作ってみたら、最大値・最小値がうまく表示されました。この違いはどうしてですか?教えてください。 import java.io.*; class Hairetu1 { public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("データはいくつですか?"); String str = br.readLine(); int num = Integer.parseInt(str); int a[]=new int[num]; int i; int max=0; int min=a[0]; for(i=0; i<a.length; i++){ System.out.print((i+1)+"番目は?"); str = br.readLine(); int tmp = Integer.parseInt(str); a[i] = tmp; if(max<tmp){ max=tmp; } if(min>tmp){ min=tmp; } } System.out.println("入力した値は"+test.length); System.out.println("最大は"+max); System.out.println("最小は"+min); } }

    • ベストアンサー
    • Java