1

我有一个 java 编程任务,你必须在一行中输入一个日期,它会根据日期为你提供一个命理(类似星座)的报告。假设用户将输入格式化的日期,用空格分隔。

我可以使用 in.nextInt() 检索输入的月、日和年。但是,我还必须检查用户是否为日期的每个部分使用了正确的分隔字符,这意味着我只需要检查用户是否使用了正斜杠。

在查看下面的代码时,我目前使用 charAt() 来查找分隔字符。问题是日期并不总是 14 个字符长。所以 10 / 17 / 2004 形式的日期有 14 个字符长,但 4 / 7 / 1992 的日期只有 12 个字符长,这意味着“slash1”不会总是在.charAt(3) 中,在后一种情况是 in.charAt(2)。

java 是否有允许类似 in.nextChar() 的方法?我知道它没有,但我怎么能在日期中找到下一个字符?

编辑:我最初忘记反映这一点,但我的教授说我们不允许使用 String.split() 方法,出于某种原因。问题是,我完全可以得到月份、日期和年份。我只需要检查该人是否使用正斜杠来分隔日期。如果输入破折号,则日期无效。

public void getDate()
{
    char slash1, slash2;

    do
    {
        System.out.print("Please enter your birth date (mm / dd / yyyy): ");
        Scanner in = new Scanner(System.in);
        String date = in.nextLine();

        month = in.nextInt();
        day = in.nextInt();
        year = in.nextInt();

        slash1 = date.charAt(3);
        slash2 = date.charAt(8);
    } while (validDate(slash1, slash2) == false);

    calcNum();
}
4

5 回答 5

1

你可以考虑用 分割输入日期字符串" / ",然后你得到一个字符串数组。下一步是将该数组中的每个字符串转换为 int。

于 2012-12-07T23:32:30.477 回答
0

与其考虑使用什么字符作为分隔符,不如关注你想要的内容,也就是数字。

此代码在非数字上拆分,每组中有多少数字或使用哪些字符作为分隔符都无关紧要:

String[] parts = input.split("\\D+");

它也几乎没有任何代码,因此出现错误的可能性要小得多。

现在您在 String[] 中有了数字部分,您可以继续进行计算。

以下是您可以在上述拆分之后使用的一些代码:

if (parts.length != 3) {
    // bad input
}

// assuming date entered in standard format of dd/mm/yyyy
// and not in retarded American format, but it's up to you
int day = Integer.parseInt(parts[0];
int month = Integer.parseInt(parts[1];
int year = Integer.parseInt(parts[2];
于 2012-12-07T23:59:40.817 回答
0

在流中向前看,以确保它包含您期望的内容。

private static final Pattern SLASH = Pattern.compile("\\s*/\\s*");

static SomeTypeYouMadeToHoldCalendarDate getDate() {
  while (true) { /* Might want to give user a way to quit. */
    String line = 
      System.console().readLine("Please enter your birth date (mm / dd / yyyy): ");
    Scanner in = new Scanner(line);
    if (!in.hasNextInt())
      continue;
    int month = in.nextInt();
    if (!in.hasNext(SLASH)
      continue;
    in.next(SLASH);
    ...
    if (!validDate(month, day, year))
      continue;
    return new SomeTypeYouMadeToHoldCalendarDate(month, day, year);
  }
}
于 2012-12-08T00:17:55.533 回答
0

我会使用扫描仪只是为了得到一条线。然后 split() 空白处的行并检查字段:

import java.util.Scanner;
import java.util.regex.Pattern;

public class GetDate {

   int month, day, year;

   public static void main(String[] args)
   {
      GetDate theApp = new GetDate();
      theApp.getDate();

   }

   public void getDate()
   {
      String date;
      do
      {
         System.out.print("Please enter your birth date (mm / dd / yyyy): ");
         Scanner in = new Scanner(System.in);
         date = in.nextLine();
      } while (validDate(date) == false);


      calcNum();
   }

   boolean validDate(String date)
   {
      // split the string based on white space
      String [] fields = date.split("\\s");

      // must have five fields
      if ( fields.length != 5 )
      {
         return false;
      }

      // must have '/' separators
      if ( ! ( fields[1].equals("/") && fields[3].equals("/") ) )
         return false;

      // must have integer strings
      if ( ! ( Pattern.matches("^\\d*$", fields[0]) && 
               Pattern.matches("^\\d*$", fields[2]) &&
               Pattern.matches("^\\d*$", fields[4]) ) )
         return false;

      // data was good, convert strings to integer 
      // should also check for integer within range at this point
      month = Integer.parseInt(fields[0]);
      day = Integer.parseInt(fields[2]);
      year = Integer.parseInt(fields[4]);

      return true;
   }

   void calcNum() {}
}
于 2012-12-08T00:36:04.227 回答
0

这使用 Scanner 方法来解析:

import java.util.Scanner;
import java.util.InputMismatchException;

public class TestScanner {

   int month, day, year;
   public static void main(String[] args)
   {
      TestScanner theApp = new TestScanner();   
      theApp.getDate();
      theApp.calcNum();
   }

   public void getDate()
   {
      int fields = 0;
      String delim1 = "";
      String delim2 = "";
      Scanner in = new Scanner(System.in);

      do
      {
         fields = 0;
         System.out.print("Please enter your birth date (mm / dd / yyyy): ");
         while ( fields < 5 && in.hasNext() )
         {
            try {
               fields++;
               switch (fields)
               {
                  case 1:
                     month = in.nextInt();
                     break;
                  case 3:
                     day = in.nextInt();
                     break;
                  case 5:
                     year = in.nextInt();
                     break;
                  case 2:
                     delim1 = in.next();
                     break;
                  case 4:
                     delim2 = in.next();
                     break;
               }
            }
            catch (InputMismatchException e)
            {
               System.out.println("ERROR: Field " + fields + " must be an integer");
               String temp = in.nextLine();
               fields = 6;
               break;
            }
         }
      } while ( fields != 5 || validDate(delim1, delim2) == false);
      in.close();
      System.out.println("Input date: " + month + "/" + day + "/" + year);
   }   

   boolean validDate(String delim1, String delim2)
   {
      if ( ( !  delim1.equals("/") ) || ( ! delim2.equals("/") ) ) 
      {
         System.out.println("ERROR: use '/' as the date delimiter");
         return false;
      }
      if ( month < 1 || month > 12 )  
      {
         System.out.println("Invalid month value: " + month);
         return false;
      }
      if (  day < 1 || day > 31 ) 
      {
         System.out.println("Invalid day value: " + day);
         return false;  
      }
      if (  year < 1 || year > 3000 ) 
      {
         System.out.println("Invalid year: " + year);
         return false;  
      }
      return true;
   }

   void calcNum()
   {

   }

}
于 2012-12-08T07:56:39.100 回答