2017-10-07 68 views
0

我一直試圖做一個簡單的秒到小時和分鐘轉換器只是爲了練習一些C#。奇怪的是,當我通過599秒標記時,程序減去60秒。所以,540秒等於9分鐘; 599秒等於9分59秒,但600秒等於9分鐘。我試着用一個按鈕來觸發命令而不是textchanged,並且按鈕做得很好。所以,我認爲,問題的根源必須是textchanged事件本身。我將增加三個例子。截圖圖像是土耳其語,但你會很容易明白。Textchanged事件將無法正確計算

我該如何解決這個問題,以及導致這個問題的原因是什麼?這真的讓人難以置信。這應該被減去secondLeft值

second = second - minuteLeft; 

Screenshot

int second, minute, hour, minuteLeft, secondLeft; 

    private void txtTime_TextChanged(object sender, EventArgs e) 
    { 
     CalculateTime(); 

    } 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    void CalculateTime() 
    { 
     if (txtTime.Text != "") 
     { 

      second = Convert.ToInt32(txtSure.Text); 
      secondLeft = second % 60; 
      second = second - minuteLeft; 

      minute = second/60; 
      minuteLeft = minute % 60; 
      minute = minute - minuteLeft; 

      hour = minute/60; 


      lblMsg.Text = hour.ToString() + " hours, " + minuteLeft.ToString() + " minutes " + secondLeft.ToString() + " seconds."; 
     } 
     else 
     { 
      lblMsg.Text = ""; 
     } 
+0

我強烈建議刪除這條線'int second,minute,hour,minuteLeft,secondLeft;',然後根據需要在'CalculateTime'中聲明變量。 _不需要'second''等字段._ – mjwills

+0

@mjwills嗨,感謝您的反饋。這樣做的好處是什麼?爲了使代碼更清潔? –

+0

是的,使它更清潔。而且,編譯器會立即向您顯示錯誤。 'var second = Convert.ToInt32(txtSure.Text); var secondLeft = second%60; second = second - minuteLeft; var minute = second/60; var minuteLeft = minute%60; 分鐘=分鐘 - 分鐘左邊; var hour = minute/60;''不會編譯 - 因爲你的bug。這很好 - 編譯器(而不是stackoverflow)爲你做了很多努力! – mjwills

回答

0

您是從秒數中減去minuteLeft

second = second - secondLeft; 
+0

我不相信我錯過了它。謝謝!儘管如此,我怎樣才能使它完美的按鈕?代碼完全一樣。 –

0

你可以考慮進攻問題以不同的方式:

var durationInSeconds = Convert.ToInt32(txtTime.Text); 
var duration = new TimeSpan(0, 0, durationInSeconds); 

var second = duration.Seconds; 
var minute = duration.Minutes; 
var hour = Convert.ToInt32(Math.Truncate(duration.TotalHours)); 

TimeSpan非常適合於這個類的問題,並且將允許你「自動」提取的持續時間的小時,分​​鍾和第二組分。

你也可以考慮更換:

hour.ToString() + " hours, " + minuteLeft.ToString() + " minutes " + secondLeft.ToString() + " seconds."; 

有一個呼叫:從https://codereview.stackexchange.com/questions/24995/convert-timespan-to-readable-text

public static string ToPrettyFormat(TimeSpan timeSpan) 
{ 
    var dayParts = new[] { GetDays(timeSpan), GetHours(timeSpan), GetMinutes(timeSpan) } 
     .Where(s => !string.IsNullOrEmpty(s)) 
     .ToArray(); 

    var numberOfParts = dayParts.Length; 

    string result; 
    if (numberOfParts < 2) 
     result = dayParts.FirstOrDefault() ?? string.Empty; 
    else 
     result = string.Join(", ", dayParts, 0, numberOfParts - 1) + " and " + dayParts[numberOfParts - 1]; 

    return result.UppercaseFirst(); 
} 

被盜。