Problem mit Rundung

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Problem mit Rundung

    Hallo, ich schreibe (noch, gleich Feierabend) ein C#-Programm.

    Eine Timer-Prozedur ruft die asynchrone Verarbeitung auf. Hier soll ein Label aktualisiert werden. Obwohl die Millisekunden nur auf 1 Nachkommastelle angezeigt werden sollen, werden immer 3 angezeigt.

    Ein weiteres Problem ist, dass ich (double) zum casten schreiben musste.

    C#-Quellcode

    1. private async void Timer1_Tick(object sender, EventArgs e)
    2. {
    3. await Task.Run(() => Verarbeitung());
    4. }
    5. private void Verarbeitung()
    6. {
    7. jetzt = DateTime.Now;
    8. TS = jetzt - Aufnahmestart;
    9. this.BeginInvoke((Action)(() => { Label_Dauer.Text = TS.Hours.ToString(DEU).PadLeft(2, '0') + ":" + TS.Minutes.ToString(DEU).PadLeft(2, '0') + ":" + TS.Seconds.ToString(DEU).PadLeft(2, '0') + "." + Math.Round((double)TS.Milliseconds, 0).ToString(DEU); }));
    10. }


    mit

    C#-Quellcode

    1. private DateTime Aufnahmestart;
    2. private DateTime jetzt;
    3. private readonly System.Globalization.CultureInfo DEU = new System.Globalization.CultureInfo("de-DE");
    4. private TimeSpan TS;


    Aufnahmestart wird unmittelbar vor dem Timer1.Start() auf DateTime.Now; gesetzt.

    Ich hoffe, ich komme gut in C# rein.
    Bilder
    • Screenshot 2021-03-06 022752.png

      1,05 kB, 126×37, 185 mal angesehen
    • Screenshot 2021-03-06 022846.png

      26,2 kB, 1.205×273, 61 mal angesehen
    Ähm ... du wirfst da einiges durcheinander ... wenn TS.Milliseconds dem Wert 499 entspricht, gibt es da nichts zu runden und du fügst den Wert einfach an.
    Vor allem benutzt du schon ToString(...), aber irgendwie auch nicht.
    Schau dir mal folgende Links an:
    TimeSpan.ToString Method
    Standard TimeSpan format strings
    Custom TimeSpan format strings

    Wenn du das richtige Format benutzt, kannst du dir den ganzen Müll sparen und einfach folgendes machen:
    TS.ToString("c") = 00:00:06.4990000
    TS.ToString("ss\\.fff") = 06.499
    TS.ToString("ss\\.f") = 06.4

    PS: TS.Milliseconds ist ein int
    @slice Jou.
    @Bartosz Lass das ganze im GUI-Thread ohne Task und Invoke laufen, das läuft schneller und ruhiger.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    dem Wert 499 entspricht, gibt es da nichts zu runden
    Ach herrje, da war ich wohl abwesend. Ich wollte erreichen, dass nur die Hunderter angezeigt werden. Du hast Recht, Math.Round hilft mir nicht. Das ist übrigens auch der Grund dafür, dass ich auf TS.ToString("c") verzichtet habe. Ich hab' das schon gesehen :D
    PS: TS.Milliseconds ist ein int
    Drum wunderte ich mich!
    Lass das ganze im GUI-Thread ohne Task und Invoke laufen
    Ok, mach ich :)



    so geht's

    C#-Quellcode

    1. Label_Dauer.Text = TS.ToString("hh\\:mm\\:ss\\.f", DEU)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bartosz“ ()

    Die CultureInfo ist trotzdem überflüssig, da er ein Custom-Format benutzt. Nur wenn er ein Standard-Format benutzten würde, wäre es von Bedeutung.
    Die CultureInfo ist trotzdem überflüssig, da er ein Custom-Format benutzt.
    Stimmt, kann in diesem Fall weg.

    PS: @ErfinderDesRades dies private readonly System.Globalization.CultureInfo DEU = new System.Globalization.CultureInfo("de-DE"); habe ich mir einst angewöhnt, weil der FxCopAnalyzer immer Stress machte von wegen „Je nach Land ändern sich die Regeln. Pass auf, wenn du Eingaben aus der Textbox entgegen nimmst. (ich weiß den genauen Wortlaut jetzt nicht). Na jedenfalls stimmt das auch. Ich bin einmal mit Datumsangaben auf die Schn...e geflogen (mm/dd/yyyy vs. dd/mm/yyyy) und wollte ab da definierte Verhältnisse haben. Auch soll immer 3,4 (drei komma vier) angezeigt werden, statt 3.4. Letzteres passiert zwar sowieso, wenn der PC in Deutschland steht und auf Deutsch eingestellt ist, aber wie gesagt, ich hab's mir der Form halber angewöhnt. :)
    damit auf Rechnern mit englischer Kultur dein TimeSpan trotzdem nach den Regeln Deutschlands angezeigt wird.
    Jup.