2017-07-17 72 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

相关问题