C# 时间计算器将字符串秒转换为分钟、小时、天,没有时间跨度



我是一个学生,对这个程序提示非常困惑,我需要创建一个具有秒输入的程序,当按下计算按钮时,秒会显示,并将其转换为分钟、小时和天。

我知道我的格式不正确,我已经通读了我的文本,试图找到与我的程序远程相关的东西,但我正在努力找到它。

有人可以向我解释我哪里出错了以及为什么?

我想再次强调,我仍在学习 C#,还没有达到时间跨度。因此,这需要在字符串转换以及某种 if 语句中。

也请提供解释,因为我想掌握这个窍门。我还需要对此进行输入验证,我在下面进行了尝试。

这是我的代码:

private void CalculateButton_Click(object sender, EventArgs e)
{
int totalSeconds, minutes, hours, days;
int secondsInDay = 60 * 60 * 24;
int secondsInHour = 60 * 60;
int secondsInMinute = 60;

if (int.TryParse(secondsInputTextBox.Text, out totalSeconds))
{
if (totalSeconds > secondsInDay)
{
days = totalSeconds / secondsInDay;
totalSeconds = totalSeconds - (days * secondsInDay);
daysTextBox.Text = days.ToString();
}
if (totalSeconds > secondsInHour)
{
hours = totalSeconds / secondsInHour;
totalSeconds = totalSeconds - (hours * secondsInHour);
hoursTextBox.Text = hours.ToString();
}
if (totalSeconds > secondsInMinute)
{
minutes = totalSeconds / secondsInMinute;
totalSeconds = totalSeconds - (minutes * secondsInMinute);
minutesTextBox.Text = minutes.ToString();
}
else
{
secondsTextBox.Text = totalSeconds.ToString();
}
}
else
{
MessageBox.Show("Incorrect input. Please use a number.");
}

注释:

  1. "else if"逻辑不正确。想想如果你有超过一小时的秒数会发生什么:那么显然你有超过一分钟的秒数,但你的"else if"语句意味着这个小时块
else if(hours >= totalSeconds)
hours = int.hoursTextBox.Text;

。永远不会执行。

  1. 你的作业向后看。当然,您希望使用计算值更新相应的文本框。

int.minutesTextBox.Text = minutes;
  1. 但是此语法也不正确。
int.minutesTextBox.Text
">

int"是一个类,int 没有一个名为"minutesTextBox"的成员。你想要更多类似的东西

minutesTextBox.Text = minutes.ToString();
  1. 不太重要,但如果你已经在上面解析过,你不需要 TryParse(totalSeconds(。

以下是稍作修改的解决方案。

更新

若要获得有效的解决方案,请在 Visual Studio 中创建 WPF 应用程序。在 MainWindow.xaml 中,将以下代码放在网格标记之间:

<Button Width="100" Height="50" Click="CalculateButton_Click" Margin="53,44,564,226"/>      
<TextBox Name="inputTextBox"  Height="50" Width="100" Margin="298,44,319,226"/>
<TextBox Name="secondsTextBox"  Height="50" Width="100" Margin="574,233,43,37"/>
<TextBox Name="minutesTextBox"  Height="50" Width="100" Margin="392,233,225,37"/>
<TextBox Name="hoursTextBox"  Height="50" Width="100" Margin="198,233,419,37"/>
<TextBox Name="daysTextBox"  Height="50" Width="100" Margin="53,233,564,37"/>

在 MainWindow.xaml 中.cs添加方法:

private void CalculateButton_Click(object sender, RoutedEventArgs e)
{
daysTextBox.Text = null;
hoursTextBox.Text = null;
int totalSeconds, minutes, hours, days;
int secondsInDay = 60 * 60 * 24;
int secondsInHour = 60 * 60;
int secondsInMinute = 60;
int.TryParse(inputTextBox.Text, out totalSeconds);            
if (totalSeconds > (secondsInDay))
{
days = totalSeconds / (secondsInDay);
totalSeconds = totalSeconds - (days * secondsInDay);
daysTextBox.Text = days.ToString();
}
else daysTextBox.Text = null;
if (totalSeconds > (secondsInHour))
{
hours = totalSeconds / (secondsInHour);
totalSeconds = totalSeconds - (hours * secondsInHour);
hoursTextBox.Text = hours.ToString();
}
else hoursTextBox.Text = null;
if (totalSeconds > secondsInMinute)
{
minutes = totalSeconds / secondsInMinute;
totalSeconds = totalSeconds - (minutes * secondsInMinute);
minutesTextBox.Text = minutes.ToString();
}
else minutesTextBox.Text = null;
if (totalSeconds > 0)
secondsTextBox.Text = totalSeconds.ToString();
else secondsTextBox.Text = null;        
}

这个解决方案并不完美。一个有用的练习是添加验证、添加标签和清理 xaml,或者将其转换为 Windows 窗体应用程序。我已经重新添加了 else 语句,每个else语句都与其上面的if语句相关联。这在逻辑上与其他if不同

我建议将此过程分解为不同的区域 - 执行转换算术的区域,以及在UI中分配值的区域。

要将total_seconds值分解为天、小时、分钟和秒,通常使用 (a( 整数除法和 (b( 余数 (%( 运算。

(说明性代码示例...

//Calculate values
days = total_seconds / NUM_SECONDS_IN_DAY;
days_rem = total_seconds % NUM_SECONDS_IN_DAY;
hours = days_rem / NUM_SECONDS_IN_HOUR;
hours_rem = days_rem % NUM_SECONDS_IN_HOUR;
minutes = hours_rem / NUM_SECONDS_IN_MINUTE;
minutes_rem = hours_rem % NUM_SECONDS_IN_MINUTE;
seconds = minutes_rem;
//Set textboxes to actual values
daysTextBox.Text = days.ToString();
hoursTextBox.Text = hours.ToString();
minutesTextBox.Text = minutes.ToString();
secondsTextBox.Text = seconds.ToString();
//Blank zero values
if (days < 1) 
{
daysTextBox.Text = null;
if (hours < 1) 
{
hoursTextBox.Text = null;
if (minutes < 1) minutesTextBox.Text = null;
}
}

我不太清楚消隐行为,但我认为我已经捕获了您需要的消隐量,直到最小的非零量水平,并在所有情况下都留下秒数。

最新更新