2013-09-29 28 views
0

我试图检查用户是否以特定格式输入字符串。 我不能使用SimpleDateFormat,捕捉,分割或沿着这些行的任何东西,因为我没有学到它。我处于初级阶段,并已学会如何使用和操纵字符串。 用户将输入mm/dd/yyyy(我正在使用JOptionPane),因此它是一个字符串。我已将月,日,年作为子字符串(并转换为整数用于其他用途)。但是,如果输入m/dd/yy,则一切都会出错。由于人们不能信任遵循指示,我需要一些东西来捕捉不正确的条目。 我已经了解了公历,但不确定会有帮助。最后,我需要使用数组将mm/dd/yyyy转换为MMM/dd/yyyy。因此,我首先要检查该条目是否有效,然后转换为整数并使用该数字与月份数组重合,然后确保该日期在该月的天数之内。最后,我需要给出今年的一天,这就是为什么我解析(?)整数。只要用户正确输入,其他所有功能都可以使用。随意建议任何其他编辑。我确实尝试过使用一个对象,但是它有一个非常困难的时间,所以改为并行数组。确定用户输入的字符串是否为正确的格式

import javax.swing.*; 
import java.util.*; 
public class ConvertDate 
{ 
    public static void main(String[] agrs) 
{ 

     int numOfDay; 
     String date, mnthName = ""; 
     int monthNumber, dayNumber, yearNumber; 
     String month = "", day = "", year = ""; 
     int validDays = 31; 

     int monthNum[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; 
     String[] monthName = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; 
     int[] daysInMonth = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 

     date = JOptionPane.showInputDialog(null, "Please enter a date. Use format mm/dd/yyy"); 
     month = date.substring(0, 2); 
     day = date.substring(3, 5); 
     year = date.substring(6, 10); 
     yearNumber = Integer.parseInt(year); 
     monthNumber = Integer.parseInt(month); 
     dayNumber = Integer.parseInt(day); 

     for(int x = 0; x < 12; x++) 
     { 
      if(monthNumber == monthNum[x]) 
      { 
       mnthName = monthName[x]; 
       validDays = daysInMonth[x]; 
      } 
     } 

     GregorianCalendar dayOfYear = new GregorianCalendar(yearNumber, (monthNumber - 1), dayNumber); 
     numOfDay = dayOfYear.get(GregorianCalendar.DAY_OF_YEAR); 

     if(dayNumber > validDays || dayNumber < 0 || monthNumber < 0 || monthNumber > 12) 
// if(!date.equals("**/**/****")) does not work, nor if(!date.equals(**"/"**"/"****)) 
      JOptionPane.showMessageDialog(null, "Invalid date or invalid format."); 
     else 
      JOptionPane.showMessageDialog(null, mnthName + " " + dayNumber + ", " + year + " is \nthe " + numOfDay + " day of the year."); 

    }  
} 
+3

学会使用这些东西。 – chrylis

+1

您花费在试图解决这个问题上的努力将花费更多的时间学习使用split,try/catches或SimpleDateFormat。 –

+0

我明白了。但是,我正试图保持在迄今为止已被覆盖的范围内。我也在尝试'if(... month.lenght()!= 2 ...)',但它会看到6 /。 –

回答

0

使用if(year.length != 4)因为如果日期被以任何其他方式进入,将导致超过400个字符以外的东西。我也改变了它,以获得“/”字符,所以他们不能输入6/23/2013(这将导致4年字符)。

0

我的建议是独立的三个值由分隔符"\"split方法字符串它会帮助你,如果用户输入1,而不是01,同样的DD和mm格式。现在将此值分配给相应的日期,月份和年份变量。

这是因为尝试输入1/1/2013这应该是一个有效的日期与有效的格式,在这里你使用的子字符串功能,导致价值1/1/2013投掷java.lang.StringIndexOutOfBoundsException。

现在验证您的值为1月至12月之间的月份以及1至31日之间的月份,即1月份可以有31天,4月份可以有30天,等等。

此外,确认一年的闰年功能。

我也建议你做一些功能/方法来模块化你的代码。

+0

我也建议,如果你习惯于正则表达比它肯定会消除你的问题,并轻松解决你的问题 –

1

你可以使用Regex来检查用户的输入是否与你想要的格式相匹配。

date = JOptionPane.showInputDialog(null,“Please enter a date。Use format mm/dd/yyy”); boolean bool = data.match(“[0-9] {2} // [0-9] {2} // [0-9] {4}”);