2017-07-17 133 views
1

我是新來的人,我希望我在正確的地方。 任何人都可以幫助我嗎? (日期時間格式):日期開始 第二個是(日期時間格式):日期結束 第三個是(Timespan格式):剩餘天數(從richTextBox1)到下一個日期(richTextBox2)。 我想要的是如果richTextBox3 < = 0顯示警告消息。 但我不知道如何將項目轉換爲雙。 在此先感謝。將richtextbox(TimeSpan)的內容轉換爲Double或Float

我的代碼:

// Reading Text File 1. 
TextReader dateOfStart = new StreamReader (TextFilePath); 

richTextBox1.Text = dateOfStart.ReadToEnd(); 
dateOfStart.Close(); 

// Reading Text File 2. 
TextReader dateOfEnd = new StreamReader (TextFilePath); 

richTextBox2.Text = dateOfEnd.ReadToEnd(); 
dateOfEnd.Close(); 

// Convert to DateTime 1 
DateTime dateStarting = DateTime.Parse(dateOfStart); 

// Convert to DateTime 2 
DateTime dateEnding = DateTime.Parse(dateOfEnd); 

// Calc 
TimeSpan remainningDays = dateEnding - dateStarting; 

// if richTextBox3 <= Zero, launch Warninng. 
If (remainningDays <= 0) 
{ 
    MessageBox.Show (Warnning !!!!!); 
}  
+0

'dateOfStart'是'StreamReader'。沒有'DateTime.Parse'的重載,它將'StreamReader'作爲輸入。也許你應該用'richTextBox1.Text'代替它? –

+0

爲什麼使用StreamReader? –

+1

將它改爲'if(remainingDays.TotalDays <= 0)',看看它是否適合你。 –

回答

1

有幾件事你可以做這項工作。

首先,您不需要直接使用StreamReader對象,您可以使用靜態File.ReadAllText()方法將文件的內容讀入字符串變量。這將打開文件,讀取文本,返回它,然後關閉文件。

richTextBox1.Text = File.ReadAllText(startDateFilePath); 
richTextBox2.Text = File.ReadAllText(endDateFilePath); 

接下來,設置您DateTime變量的時候,你想通過它的字符串值,而不是StreamReader對象。由於我們已經存儲在字符串中我們RichTextBox對象,我們就可以使用這些:

// Note that `Parse` will throw an exception if the text is not a valid date 
// Use `TryParse` instead if this is a possibility, 
//  or use a `try/catch` block and catch the FormatException 
DateTime dateStarting = DateTime.Parse(richTextBox1.Text); 
DateTime dateEnding = DateTime.Parse(richTextBox2.Text); 

然後,當你做減法,你可以訪問TimeSpanTotalDays屬性來獲取天數表示,並將您的richTextBox3.Text設置爲該值:

double remainingDays = (dateEnding - dateStarting).TotalDays; 
richTextBox3.Text = remainingDays.ToString(); 

if (remainingDays <= 0) 
{ 
    MessageBox.Show("Warning !!!!!"); 
} 
+0

我有點困惑,是不是最好把'(dateEnding - dateStarting).TotalDays'的結果存儲爲一個int,所以你可以使用它作爲文本框的值,並保存你的形式不得不做一個解析?或者,在你的例子中,這兩個代碼片段在不同的範圍內? – maccettura

+1

@maccettura是的,的確如此。我更新了這個例子。謝謝! –

+0

是的,如果它是我的,我會使用'TryParse',但是在我看來,它增加了一堆與這個問題沒有直接關係的正交代碼(添加DateTime out params,if/else block等)。還有一些其他的事情可以用來驗證輸入,例如確保'endDate'大於'startDate'。我已經對代碼中的'Parse'方法發表了評論。如果這導致問題,他可以提出一個新問題。 :) –

-1
double myDoubleValue = Double.Parse(richTextBox3.Text); 

格式不正確的數據將導致此方法拋出異常。由於您試圖解析直接的用戶輸入,因此您應該將其封裝在try-catch塊中。或者,如果您擔心性能問題,可以使用TryParseTryParse方法不會拋出異常。

+0

在Try-catch中包裝解析比僅使用TryParse()慢得多。你應該總是傾向於'TryParse()' – maccettura

+0

答:我的回答沒有錯,這是一個偏好問題。 B.性能差異可以忽略不計。 C.嘗試解析需要你去delcare並使用out變量。另外,由於OP尚未這樣做,因此執行TryParse所需的額外開銷大約等於效率的損失。用戶應驗證用戶輸入,並在發生意外事件時拋出異常。 – MBurnham

+0

投擲異常是你可以做的性能最差的事情之一,'TryParse()'大約比'Parse()'快36倍。是36倍增加「微不足道」?推理是因爲你不想使用out參數? – maccettura