查找字符串中的下一个字符?

时间:2012-12-07 23:21:07

标签: java date char

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

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

在查看下面的代码时,我目前使用charAt()来查找分隔字符。问题是日期不会总是14个字符。因此,10 / 17/2004形式的日期长度为14个字符,但是日期为4/7/1992只有12个字符长,这意味着“slash1”并不总是in.charAt(3),in后一种情况就是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();
}

5 个答案:

答案 0 :(得分:1)

您可以考虑将输入日期字符串与" / "分开,然后获得一个String数组。下一步是将该数组中的每个字符串转换为int。

答案 1 :(得分: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];

答案 2 :(得分: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);
  }
}

答案 3 :(得分:0)

我会使用Scanner来获取一条线。然后在空格上拆分()行并检查字段:

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() {}
}

答案 4 :(得分: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()
   {

   }

}