将richtextbox(TimeSpan)的内容转换为Double或Float
我是新来的人,我希望我在正确的地方。 任何人都可以帮助我吗? (日期时间格式):日期开始 第二个是(日期时间格式):日期结束 第三个是(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 !!!!!);
}
有几件事你可以做这项工作。
首先,您不需要直接使用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);
然后,当你做减法,你可以访问TimeSpan
的TotalDays
属性来获取天数表示,并将您的richTextBox3.Text
设置为该值:
double remainingDays = (dateEnding - dateStarting).TotalDays;
richTextBox3.Text = remainingDays.ToString();
if (remainingDays <= 0)
{
MessageBox.Show("Warning !!!!!");
}
我有点困惑,是不是最好把'(dateEnding - dateStarting).TotalDays'的结果存储为一个int,所以你可以使用它作为文本框的值,并保存你的形式不得不做一个解析?或者,在你的例子中,这两个代码片段在不同的范围内? – maccettura
@maccettura是的,的确如此。我更新了这个例子。谢谢! –
是的,如果它是我的,我会使用'TryParse',但是在我看来,它增加了一堆与这个问题没有直接关系的正交代码(添加DateTime out params,if/else block等)。还有一些其他的事情可以用来验证输入,例如确保'endDate'大于'startDate'。我已经对代码中的'Parse'方法发表了评论。如果这导致问题,他可以提出一个新问题。 :) –
double myDoubleValue = Double.Parse(richTextBox3.Text);
格式不正确的数据将导致此方法抛出异常。由于您试图解析直接的用户输入,因此您应该将其封装在try-catch块中。或者,如果您担心性能问题,可以使用TryParse
。 TryParse
方法不会抛出异常。
在Try-catch中包装解析比仅使用TryParse()慢得多。你应该总是倾向于'TryParse()' – maccettura
答:我的回答没有错,这是一个偏好问题。 B.性能差异可以忽略不计。 C.尝试解析需要你去delcare并使用out变量。另外,由于OP尚未这样做,因此执行TryParse所需的额外开销大约等于效率的损失。用户应验证用户输入,并在发生意外事件时抛出异常。 – MBurnham
投掷异常是你可以做的性能最差的事情之一,'TryParse()'大约比'Parse()'快36倍。是36倍增加“微不足道”?推理是因为你不想使用out参数? – maccettura
'dateOfStart'是'StreamReader'。没有'DateTime.Parse'的重载,它将'StreamReader'作为输入。也许你应该用'richTextBox1.Text'代替它? –
为什么使用StreamReader? –
将它改为'if(remainingDays.TotalDays