2017-10-07 7 views
0

私は、ちょうどC#を練習するために簡単な2時間から1分のコンバータを作成しようとしています。奇妙なことは、私が599秒を過ぎると、プログラムは60秒を減算します。したがって、540秒は9分に相当します。 599秒は9分59秒に等しいが、600秒は9分に等しい。私はボタンを使用してコマンドをトリガーする代わりにtextchangedボタンを使ってみました。だから、私は、問題の根本はテキスト変更イベントそのものでなければならないと思う。私は3つの例を追加します。スクリーンショットイメージはトルコ語ですが、簡単にそのアイデアを得ることができます。Textchangedイベントが正しく計算されない

どうすればこの問題を解決できますか?この問題の原因は何ですか?これは本当に心配です。

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

この行を削除することを強くお勧めします。second、minute、hour、minuteLeft、secondLeft; 'CalculateTime'で必要に応じて変数を宣言します。 _「second」などのフィールドは必要ありません。 – mjwills

+0

@mjwillsこんにちは、フィードバックに感謝します。そうすることの利点は何でしょうか?コードをきれいにするには? –

+0

はい、クリーナーにします。また、コンパイラはすぐにあなたにバグを示していたでしょう。 'var second = Convert.ToInt32(txtSure.Text); var secondLeft =秒%60; 秒=秒 - 分; var分=秒/ 60; var minuteLeft =分%60; 分=分 - 分左; var hour =分/ 60; 'あなたのバグのためにコンパイルできませんでした。これは素晴らしいです - コンパイラ(stackoverflowではなく)はあなたのために大変でした! – mjwills

答えて

0

あなたは秒数からminuteLeftを引いている:あなたが問題を攻撃検討することもでき

second = second - secondLeft; 
+0

私はそれを逃したとは思わない。ありがとうございました!それでも、ボタンを使って完全に動作させるにはどうしましたか?コードはまったく同じでした。 –

0

:secondLeft値を減算する必要があります

second = second - minuteLeft; 

別の方法で:

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(); 
} 

関連する問題