我有一个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();
}
答案 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()
{
}
}