【问题标题】:C# Time calculator converting string seconds, to minutes, to hours, to days WITHOUT time spanC# 时间计算器将字符串秒、分钟、小时、天转换为无时间跨度
【发布时间】:2019-09-14 14:04:37
【问题描述】:

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

我知道我的格式不正确,并且我已经通读了我的文本,试图找到与我的程序远程相关的内容,但我很难找到它。

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

再次强调,我仍在学习 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.");
        }

【问题讨论】:

    标签: c# string int calculation


    【解决方案1】:

    评论:

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

    ...永远不会执行。

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

                 int.minutesTextBox.Text = minutes;
    
    1. 但是这种语法也是不正确的。
                 int.minutesTextBox.Text
    

    “int”是一个类,并且没有名为“minutesTextBox”的 int 成员。你想要的东西更像

                 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 语句相关联。这在逻辑上 else if 不同。

    【讨论】:

    • 所以我要澄清一下,代码的目的是我有一个文本输入,有四个标签输出,分别代表秒、分钟、小时和天。当我按下计算时,第一个文本框中的秒数(比如说 120 秒)意味着在下面的秒、分钟、小时和天标签中表示。所以秒数将显示 120,分钟 2,小时 0 和天 0。
    • 我明白了。那么,根据需要修改逻辑。其他点应该仍然有用。
    • 其实你知道的。我刚刚意识到提示在输入中需要类似“135 秒”的内容,并将其转换为 0 天、0 小时、2 分钟和 15 秒。我道歉。我相信你给了我一个正确的代码。尝试处理这个问题已经很长时间了。我觉得这门课很煎熬。
    • 不用担心。如果您认为它解决了您的问题,请考虑接受它作为答案。谢谢,祝你好运。
    • 好的,所以我对此进行了测试,我认为我们在正确的轨道上。我的问题是,如果限制应该在 60 秒后,它被转换为 1 分钟,在 60 分钟后它被转换为 1 小时,依此类推,我是否需要包含该输入验证?我需要包含 try-else 语句来清除异常。 (就像有人要输入字母而不是数字一样。)这就是我尝试使用 if-else-if 语句或 switch 语句的原因。我希望这是有道理的。我很困惑,也很新,所以我很感激你的澄清。
    【解决方案2】:

    我建议将此过程分成不同的区域 - 执行转换算术的区域,以及在 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;
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      相关资源
      最近更新 更多