1

したがって、DD/MM/YYYY の形式で生年月日の入力を取得しようとしています。入力の長さは 10 文字を超えることはできません。ユーザーが A51/1 のようなものを入力しないように、適切な形式であることを確認する必要があります。 /1982、少なくとも私の知る限りでは正しく書かれていると思います:)しかし、入力をチェックするときにwhileループで永遠に立ち往生しています

       System.out.println("Please enter your date of birth in the format DD/MM/YYYY");
   dateOfBirth = scanner.nextLine(); //Read date of birth
   dob0 = dateOfBirth.substring(0);// to check char 0 is between 0-3
   dob1 = dateOfBirth.substring(1);// to check char 1 is between 0-9
   dob2 = dateOfBirth.substring(2);// to check char 2 is between /
   dob3 = dateOfBirth.substring(3);// to check char 3 is between 0-1
   dob4 = dateOfBirth.substring(4);// to check char 4 is between 0-9
   dob5 = dateOfBirth.substring(5);// to check char 5 is between /
   dob6 = dateOfBirth.substring(6);// to check char 6 is between 1-2
   dob7 = dateOfBirth.substring(7);// to check char 7 is between 0-9
   dob8 = dateOfBirth.substring(8);// to check char 8 is between 0-9
   dob9 = dateOfBirth.substring(9);// to check char 9 is between 0-9
   dob = dateOfBirth.length(); //convert string to int to check length
   while (dob !=10 || !dob0.matches("[0-3]+") || !dob1.matches("[0-9]+") ||      !dob2.matches("[/]+")
    || !dob3.matches("[0-1]+") || !dob4.matches("[0-9]+") || !dob5.matches("[/]+")
    || !dob6.matches("[1-2]+") || !dob7.matches("[0-9]+") || !dob8.matches("[0-9]+") 
    || !dob9.matches("[0-9]+"))//check all values
   {
   System.out.println("Please make sure you enter your date of birth in the format DD/MM/YYYY");
   dateOfBirth = scanner.nextLine();
   }

私はおそらくこのbueの周りを遠く離れてしまったと思います。

ありがとう

4

3 に答える 3

1

新しいユーザー入力を再評価していません。1行目だけ入りました。新しい入力が入力された後、 dob0= .. dob = スタッフ全体が while ループ内に入る必要があります。

于 2013-10-26T12:42:03.063 に答える
0

簡単な方法は、SimpleDateFormat を使用して parse() 関数を使用することです。ParseException がある場合は、入力が正しい形式ではないことを意味します。

http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html#parse(java.lang.String , java.text.ParsePosition)

于 2013-10-26T13:12:02.540 に答える
0

問題は、while条件がいくつかの変数をテストするdobXが、ループ内でそれらの変数を更新しないことです。しかし、それは問題の一部にすぎません。個々の文字を抽出して各文字を別の正規表現でテストする代わりに、1 つの正規表現を使用して文字列全体をテストする必要があります。

while (! dateOfBirth.matches("[0-3][0-9]/[0-1][0-9]/[1-2][0-9]{3}") { 
    dateOfBirth = scanner.nextLine();
}

またはさらに良いことにSimpleDateFormat、文字列を日付に解析しようとするようなクラスを使用します。

new SimpleDateFormat("dd/MM/yyyy").parse("26/10/2013");

while ループ内に try/catch ブロックを配置するだけです。parse成功した場合はbreak、ループから、catch例外が発生した場合は、メッセージをユーザーに出力して繰り返します。

于 2013-10-26T12:43:41.953 に答える