2016-02-28 61 views
0

我必須編寫程序,它會向用戶詢問一些數據,然後用這些數據打印一些文本。 下面只是一段代碼(其中有效),還有其他變量。用戶友好日期輸入

class Student 
{ 
    static public DateTime birthDay; 

    public void GetStudentInformation() 
    { 
     Console.WriteLine("Enter student's birth date (as mm/dd/yyyy): "); 
     birthDay = DateTime.Parse(Console.ReadLine()); 
    } 

    public void PrintStudentData(ref DateTime birthDay) 
    { 
     Console.WriteLine("Student was born in {0}", birthDay.ToString("d")); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Student newStudent = new Student(); 
     newStudent.GetStudentInformation(); 
     newStudent.PrintStudentData(ref Student.birthDay); 
     Console.ReadKey() 
    } 
} 

當我問的是生日時,我只需要日期,而不是時間。 有很多問題:

  1. 如何更改用戶該輸入日期是在其他格式比毫米/ DD/YYYY
  2. 我如何操作輸出格式日期?所以它不會是yyyy-dd-mm而是dd/mm/yyyydd.mm.yyyy

我想補充我真的在C#初學者,嘗試了一些代碼CultureInfoParseExactTryParse和modyfing輸出字符串{0:'dd/mm/yyyy'}

+1

一兩個建議:1)不要在您的clasess接口和數據表示(混合代碼,因爲他們是你贏了不能在沒有終端/控制檯的環境中使用它們,ej:web)2)完全使用CultureInfo,除非它不適合你的需求。現在,我不確定這個問題,你想配置日期格式嗎?無論如何,「freandly」意味着什麼?編輯:我假設你已經測試過你提到的方法。 [你可以編輯你的問題來補充說明] – Theraot

+0

@Theraot - 我沒有得到你的第一點。這段代碼有什麼問題?我應該爲某些數據創建另一個類嗎? 是的,我測試過這個程序很多次。 我的第二個問題是關於輸出字符串。程序打印'學生出生在yyyy-dd-mm',我會將其轉換爲例如'學生出生在dd/mm/yyyy'。 – Szkaplerny

+0

這沒有錯。我的措辭可能過於權威。我會這麼說:有很多方法可以完成一項任務,其中一些更有效率,更可重用,而且它們不會對齊。您可能會越來越重視可重用性而非效率。所以,我建議將UI與數據表示分開。目前的代碼是否因爲它缺乏而不合適?不,它應該可以正常工作。此外,此代碼可能永遠不會遷移,因此其可重用性可能無關緊要。儘管如此,在需要時習慣自己也很好。什麼時候?當你想要相同的核心多個用戶界面。同時你可以忘記我說的話。 – Theraot

回答

1

聽起來像DateTime.TryParseExact是一個很好的方法來做到這一點。

使用指定的格式,區域性特定 格式的信息,和樣式當量的日期和時間其 日期時間的指定字符串表示形式轉換。字符串表示 的格式必須完全匹配指定的格式。該方法返回值 ,指示轉換是否成功。

DateTime birthDay; 
if(DateTime.TryParseExact(Console.ReadLine(), "MM/dd/yyyy", 
          CultureInfo.InvariantCulture, 
          DateTimeStyles.None, out birthDay) 
{ 
    // Your input string can (and will) be parsed with MM/dd/yyyy format. 
} 
else 
{ 
    // Invalid format or value. 
} 

順便說一句,我改變了你mmMM因爲mm符是分鐘,但MM符是幾個月。

您的問題;

如何更改用戶輸入日期的格式不是 mm/dd/yyy?

不能。這可能創建了很多模糊的情況,如什麼是01/02/2016的格式?是dd/MM/yyyy還是MM/dd/yyyy?這完全取決於你住的地方以及你使用的文化設置。

如何操作輸出格式日期?所以它不會是 yyyy-dd-mm但dd/mm/yyyy或dd.mm.yyyy?

有輸出,如果你指的是Console.WriteLine部分,這The "d" standard format specifier使用的,你運行該代碼的CurrentCulture設置ShortDatePattern。這意味着輸出格式取決於當前的文化設置。如果這個屬性有dd/MM/yyyy,你會沒事的。如果不是,則應該使用自定義日期格式說明符來格式化它;

Console.WriteLine("Student was born in {0}", 
        birthDay.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture)); 
+0

是的,我知道這將是誤解,這就是爲什麼我加入到我的代碼'(如mm/dd/yyyy)'和同樣的事情,我可以添加到另一個'系統'。真的謝謝你的回答:D – Szkaplerny

0

這讓用戶輸入格式day/month/year和輸出dd.MM.yyyy

static void Main() 
{ 
    Student newStudent = new Student(); 
    newStudent.GetStudentInformation(); 
    newStudent.PrintStudentData(ref Student.birthDay); 
    Console.ReadKey(); 

    logEnd(); 
} 
class Student 
{ 
    static public DateTime birthDay; 

    public void GetStudentInformation() 
    { 
     Console.WriteLine("Enter student's birth date as day/month/year"); 

     string[] formats = { "dd/MM/yyyy", "dd/M/yyyy", "d/M/yyyy", "d/MM/yyyy", 
       "dd/MM/yy", "dd/M/yy", "d/M/yy", "d/MM/yy"}; 

     while (!DateTime.TryParseExact(Console.ReadLine(), formats, 
      System.Globalization.CultureInfo.InvariantCulture, 
      System.Globalization.DateTimeStyles.None, 
      out birthDay)) 
     { 
      Console.WriteLine("Your input is incorrect. Please input again."); 
     } 

     // User input correct, birthDay can now be used 

    } 
    public void PrintStudentData(ref DateTime birthDay) 
    { 
     Console.WriteLine("Student was born in {0}", birthDay.ToString("dd.MM.yyyy")); 
    } 
}