2017-02-02 4 views
0

Я пишу приложение консоли C#, в котором вы вводите свое имя и дату рождения в формате yyyy/mm/dd, чтобы консоль сообщила вам ваш возраст в годах и месяцах. Теперь у меня есть эта часть, и она работает. Пока я не попытался реализовать исключение try и catch, чтобы проверить, была ли введенная вами дата в правильном формате. Если нет, вам следует попросить повторить попытку еще раз 3 раза, прежде чем сообщить, что формат даты неверен, а затем выйти из приложения.Блок кода, повторяющийся, когда я хочу реализовать исключение try и catch

Теперь проблема в том, что приложение работает, но оно говорит о неправильном формате даты, даже если это не так. Затем он продолжает выдавать правильный результат после цикла через приложение, которое запрашивает имя и дату рождения 3 раза. Это код, который у меня есть до сих пор (я знаю, что выпуск в течение месяца в месяц немного грязный, я просто слишком долго тестировал слишком много вещей, чтобы попробовать и изменить его сейчас, но я открыт для улучшений и изменений):

namespace CSConsoleDateTimeTypes 
{ 
    class Program 
    { 
     static int Count = 0; 
     static void Main(string[] args) 
     { EnterDate(); } 
     static void EnterDate() 
     { 

      string userName, enteredDoBString; 
      Console.WriteLine("Enter your name:"); 
      userName = Console.ReadLine(); 
      Console.WriteLine("Enter your date of birth in the format yyyy/mm/dd:"); 
      enteredDoBString = Console.ReadLine(); 
      string dateString = Console.ReadLine(); 
      parseDateString(dateString); 
      DateTime enteredDoB = DateTime.Parse(enteredDoBString); 
      Console.WriteLine("Your DoB is: {0}", enteredDoB); 
      DateTime dateToday = DateTime.Today; 
      if (dateToday < enteredDoB) 
      { 
       DateTime date4 = dateToday; 
       dateToday = enteredDoB; 
       enteredDoB = date4; 
      } 
      TimeSpan ts = dateToday - enteredDoB; 
      //total days (irrelevant to the application though) 
      Console.WriteLine(ts.TotalDays); 
      //total years 
      int years = dateToday.Year - enteredDoB.Year; 

      int months = 0; 
      //Total months 
      if (dateToday.Month < enteredDoB.Month) 
      { 
       months = 12 - dateToday.Month + enteredDoB.Month; 
      } 
      else 
      { 
       months = enteredDoB.Month - dateToday.Month; 

      } 
      if (months > 12) 
      { 
       Console.WriteLine("Years: {0}, Months: {1}", years - 1, 12 - (months - 12)); 
      } 
      else if (months < 0) 
      { 
       Console.WriteLine("Years: {0}, Months: {1}", years, months - months); 
      } 
      else 
      { 
       Console.WriteLine("Years: {0}, Months: {1}", years, months); 
      } 
      Console.ReadKey(); 
      Console.ReadKey(); 
     } 
     static void parseDateString(string datestring) 
     { 
      try 
      { 
       DateTime date3 = DateTime.Parse(datestring, System.Globalization.CultureInfo.InvariantCulture); 
       date3.ToShortDateString(); 
       Console.ReadKey(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
       //if date was entered incorrectly 3 times, the application should exit.. 
       Count++; 
       if (Count < 3) 
       { 
        EnterDate(); 
       } 
       else 
       { 
        Console.WriteLine("\aSorry date still not in correct format - Press any key to exit the application"); 
        Console.ReadKey(); 
       } 
      } 
     } 
    } 
} 

Это выход он дает, когда я запустить приложение и завершения работы через весь код после моих входов:

Enter your name: 
gerrit 
Enter your date of birth in the format yyyy/mm/dd: 
1997/02/13 

String was not recognized as a valid DateTime. 
Enter your name: 
gerrit 
Enter your date of birth in the format yyyy/mm/dd: 
1997/02/13 

String was not recognized as a valid DateTime. 
Enter your name: 
gerrit 
Enter your date of birth in the format yyyy/mm/dd: 
1997/02/13 

String was not recognized as a valid DateTime. 
Sorry date still not in correct format - Press any key to exit the application 
Your DoB is: 1997/02/13 12:00:00 AM 
7294 
Years: 20, Months: 0 
Your DoB is: 1997/02/13 12:00:00 AM 
7294 
Years: 20, Months: 0 
Your DoB is: 1997/02/13 12:00:00 AM 
7294 
Years: 20, Months: 0 

Как вы можете видеть, он запрашивает имя и дата рождения 3 раза и до сих пор говорить формат даты неверен, то он дает правильный результат (ваш DoB: 1997/02/13 12:00:00 AM Годы: 20, Mont hs: 0) 3 раза

Он должен спрашивать один раз и выводить один раз, но я не могу понять, как это сделать. Любая помощь будет высоко оценен.

Вот скриншот выхода консоли, если это помогает на всех

http://i.imgur.com/qUpF0g2.png

+0

Проблема в том, что вы проверяете 'dateString' вместо' entryDoBString', а затем, в конце концов, используете 'signedDoBstring'. Удалите 'dateString' и передайте' signedDoBstring' в метод. –

+0

Почему у вас есть две строки кода для введенной строки даты, а именно: 'entryDoBString и' dateString'? – awh112

+0

@ChibuezeOpata и awh112 Спасибо, ребята, что я сделал это сейчас. Цените помощь. Не могу поверить, что я не видел этого ха-ха, я все еще новичок и изучаю C#. –

ответ

0

Я изменил немного кода.

Я не проверял остальную часть вашего кода, только чтобы узнать дату.

private static void Main(string[] args) 
{ 
    EnterDate(); 
} 

private static void EnterDate() 
{ 
    Console.WriteLine("Enter your name:"); 
    var userName = Console.ReadLine(); 

    // ask for date 
    var enteredDoBString = AskForDate(); 
    if (enteredDoBString == null) 
    return; 

    DateTime enteredDoB = DateTime.Parse(enteredDoBString); 
    Console.WriteLine($"Your DoB is: {enteredDoB}"); 

    DateTime dateToday = DateTime.Today; 

    if (dateToday < enteredDoB) 
    { 
    DateTime date4 = dateToday; 
    dateToday = enteredDoB; 
    enteredDoB = date4; 
    } 
    TimeSpan ts = dateToday - enteredDoB; 

    // total days (irrelevant to the application though) 
    Console.WriteLine(ts.TotalDays); 

    // total years 
    var years = dateToday.Year - enteredDoB.Year; 
    var months = 0;   

    // Total months 
    if (dateToday.Month < enteredDoB.Month) 
    { 
    months = 12 - dateToday.Month + enteredDoB.Month; 
    } 
    else 
    { 
    months = enteredDoB.Month - dateToday.Month; 
    } 

    if (months > 12) 
    { 
    Console.WriteLine($"Years: {years - 1}, Months: {12 - (months - 12)}"); 
    } 

    else if (months < 0) 
    { 
    Console.WriteLine($"Years: {years}, Months: {months - months}"); 
    } 

    else 
    { 
    Console.WriteLine($"Years: {years}, Months: {months}"); 
    } 

    Console.ReadKey(); 
    Console.ReadKey(); 
} 

private static string AskForDate() 
{ 
    var count = 0; 
    while (count++ < 3) 
    { 
    try 
    { 
     Console.WriteLine("Enter your date of birth in the format yyyy/mm/dd:"); 
     return DateTime.Parse(Console.ReadLine(), System.Globalization.CultureInfo.InvariantCulture).ToShortDateString(); 
    } 

    catch (Exception e) 
    { 
     Console.WriteLine(e.Message); 
     //if date was entered incorrectly 3 times, the application should exit.. 
    } 
    } 

    Console.WriteLine("\aSorry date still not in correct format - Press any key to exit the application"); 
    Console.ReadKey(); 

    return null; 
} 

Что я сделал:

Я удалил вашу функцию parseDateString и создать новый под названием AskForDate. Эта функция, как и название, запрашивает дату для пользователя, и внутри этой функции введенная дата проверяется, если она действительна или нет. Я считаю, что лучше проверить и спросить о той же функции. Если введенная пользователем дата указана правильно, дата возвращается как ToShortDateString. Если дата неверна, функция запрашивает еще два раза, а в третий раз возвращается null.

Затем, в функции EnterDate, если null возвращается с AskForDate функция, программа выходит.

Я также изменил некоторые интерполяции строк и удалил некоторые переменные.