2013-09-29 62 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}」);