Entwickler-Ecke
C# - Die Sprache - umrechnung minuten und stunden
Guennesack - Fr 16.05.08 17:57
Titel: umrechnung minuten und stunden
hallo zusammen ich weiß das jetzt viele von euch die hände vor dem kopf zusammen schlagen aber für mich als anfänger ist es ein großes problem.
und zwar habe ich in einem programm eine rechnung die eine zeit in minuten ausgibt, diese wird auch angezeigt z.b. "125 minuten"
jetzt möchte ich aber das dor nicht mehr minuten stehen sondern in diesem fall "2 Stunden und 5 Minuten".
ich bin total am verzweifen, wie kann ich das lösen??
bin für jeden hilfe dankbar.
JüTho - Fr 16.05.08 18:17
Die schreibst überhaupt nichts davon, welche Klassen und Methoden Du verwendest. Also müssen wir raten...
Meine Vermutung ist: Wenn diese Zeitangabe Ergebnis einer Rechnung ist, dann handelt es sich um einen TimeSpan-Wert. Mit TimeSpan.Hours usw. bekommst Du die Einzelwerte; bei TimeSpan.ToString() kannst Du als Argument genau festlegen, wie die Ausgabe formatiert werden soll.
Einzelheiten sind immer in der SDK-Doku nachzulesen; diese sollte sowieso das wichtigste Hilfsmittel sein - vor allem Foren. Jürgen
arj - Fr 16.05.08 19:40
Andererseits gibt es auch die "mathematische" Lösung:
Wieviele Minuten sind in einer Stunde? :-)
(Division und Modulo sollten helfen)
Guennesack - Fr 16.05.08 22:55
wie schon gesagt bin halt ein ziehlicher neuling,
es geht um die berechnung von übertragungs zeiten bei up bzw downloads.
man gibt halt die groesse der datei und seine internetgeschwindigkeit an und es wird die übertragungszeit in minuten berechnet.
so sieht mein rechen teil aus:
C#-Quelltext
1: 2: 3:
| x = groesse * 1024 / speed; round = x / 60; time = Math.Round(round, 2); |
es sind alles double variablen.
und als ausgabe habe ich ein ganz normales label
C#-Quelltext
1:
| labTIME.Text = Convert.ToString(time); |
wie kann ich das nun in so eine TimeSpan geschichte eingringen?
JüTho - Sa 17.05.08 10:36
Siehste, mehr Informationen helfen den Helfern. Wenn Du alles als double verwendest, dann bin ich mit meinem TimeSpan-Hinweis fehl am Platze. Aber arj's Hinweis passt.
Nach Deiner Eingangsfrage vermute ich, dass die
double-Variable time auf die Einheit "Minuten" ausgerichtet ist. Daraus solltest Du eine
int-Variable machen, damit die Vorteile der int-Division zum Tragen kommen. Dann benutzt Du die normale
String.Format()-Methode mit genauer Angabe des gewünschten Formats:
C#-Quelltext
1: 2:
| int minutes = (int)time; labTIME.Text = String.Format("{0} Stunde/n {1} Minuten", minutes / 60, minutes % 60); |
Zur Erläuterung: Bei Integers liefert die normale
Division einen int-Wert (ggf. abgerundet); was
modulo macht, ist hoffentlich bekannt. Zu
String.Format() bietet die
SDK-Doku viele zusätzliche Hinweise.
Zitat: |
wie kann ich das nun in so eine TimeSpan geschichte eingringen? |
Das geht schon, man muss nur in der
SDK-Doku nachlesen, welche Varianten es für den
Konstruktor gibt, darunter:
C#-Quelltext
1:
| TimeSpan timeDiff = new TimeSpan(0, (int)time, 0); |
Aber dieser Weg lohnt sich bei Deinem Vorgehen über double nicht.
Allgemeine Hinweise: Die
Convert-Methoden sollten möglichst nicht benutzt werden. Wenn aus einem Wert ein String werden soll, ist
ToString() die Standardmethode; dabei gibt es oft auch Möglichkeiten der Formatierung (z.B. bei DateTime), die es bei Convert.ToString() nicht gibt. Wenn aus einem String ein "anderer" Wert werden soll, sind Methoden wie
Parse, ParseExact, TryParse, TryParseExact (sofern vorhanden) entschieden besser.
Und wie ich schon zur
SDK-Doku schrieb:
Zitat: |
diese sollte sowieso das wichtigste Hilfsmittel sein - vor allen Foren. |
Gruß Jürgen
Guennesack - Sa 17.05.08 15:38
vielen dank hat funktioniert.
und da es mir nicht gefallen hat das dort bei einigen fällen 0 Stunden 30 Minuten stand. habe ich vorher noch eine klene if else bedingung gemacht.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| if (time > 60) { int minutes = (int)time; labTIME.Text = String.Format("{0} Stunde/n {1} Minuten", minutes / 60, minutes % 60); } else { labTIME.Text = time + " Minuten"; } |
jetzt habe ich noch einene kleine frage.
ich lesen die groesse der datei deren zeit berechnet werden soll über eine MaskedTextBox ein, wenn ein inhalt drinn steht klappt es wunderbar, wird das feld aber leer gelassen stürzt das programm ab. wie kann ich das verhindern??
JüTho - Sa 17.05.08 16:23
Guennesack hat folgendes geschrieben: |
ich lesen die groesse der datei deren zeit berechnet werden soll über eine MaskedTextBox ein, wenn ein inhalt drinn steht klappt es wunderbar, wird das feld aber leer gelassen stürzt das programm ab. wie kann ich das verhindern?? |
Zu dieser Art der Fragestellung hatte ich mich schon geäußert:
JüTho hat folgendes geschrieben: |
Du schreibst überhaupt nichts davon, welche Klassen und Methoden Du verwendest. Also müssen wir raten... |
Wie soll eine MaskedTextBox die Größe einer Datei erfahren? Wie kommt der Wert dort 'rein? Wie kommt der Wert von dort in eine andere Variable, und in welche?
"stürzt das Programm ab" ist immer ein Zeichen dafür, dass eine try-catch-Prüfung fehlt.
Jürgen
Guennesack - Sa 17.05.08 16:50
JüTho hat folgendes geschrieben: |
Zu dieser Art der Fragestellung hatte ich mich schon geäußert:
JüTho hat folgendes geschrieben: | Du schreibst überhaupt nichts davon, welche Klassen und Methoden Du verwendest. Also müssen wir raten... |
Jürgen |
entschudigung ich vergas.
hier mal wieder der code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| int groesse=0; int speed=0; int x=0; int time=0;
groesse = Convert.ToInt32(mtxtMB.Text); speed = Convert.ToInt32(mtxtSPEED.Text);
x = groesse * 1024 / speed; time = x / 60;
if (time > 60) { int minutes = (int)time; labTIME.Text = String.Format("{0} Stunde/n {1} Minuten", minutes / 60, minutes % 60); } else { labTIME.Text = time + " Minuten"; } } |
jetzt habe ich halt das problem das bei einer leeren textbox, visual eine meldung rausgibt wenn ich den rechnen button klicke.
"FormatException wurde nicht behandelt"
wie gekomme ich das hin das erkannt wird das die box leer ist, und ich dann z.b. ein auf einem label eine meldung ausgebe?
JüTho - Sa 17.05.08 17:49
In diesem Fall ging es mir nicht darum, den gesamten Code erneut zu lesen. Du hast aber erstmals von einer MaskedTextBox geschrieben; also will ich natürlich all das lesen, was dazu gehört.
Zitat: |
wie gekomme ich das hin das erkannt wird das die box leer ist, |
Das ist eine wichtige Prüfung für Strings, die zum Standardrepertoire gehört:
C#-Quelltext
1: 2: 3: 4: 5:
| if (String.IsNullOrEmpty(mtxtMB.Text)) { MessageBox.Show("Stop! Wo bleibt die Dateigröße?!"); } else { groesse = Int32.Parse(mtxtMB.Text); } |
Oder eine andere Variante:
C#-Quelltext
1: 2: 3: 4: 5:
| if (!Int32.TryParse(mtxtMB.Text), out groesse)) { MessageBox.Show("Stop! Die Dateigröße konnte nicht umgewandelt werden."); } else { } |
Oder als schlechteste Lösung mit try-catch:
C#-Quelltext
1: 2: 3: 4: 5:
| try { groesse = Convert.ToInt32(mtxtMB.Text); } catch(Exception ex) { MessageBox.Show(ex.ToString()); } |
Jetzt hast Du soviel Material, dass Du mit den verwendeten Klassen und Methoden in der
SDK-Doku und z.B. in
OpenBook C# [
http://www.galileocomputing.de/openbook/csharp/index.htm] sowie
OpenBook Visual C# [
http://www.galileocomputing.de/openbook/visual_csharp/index.htm] viele Erläuterungen finden solltest.
Wenn ich solche Hinweise gebe, erwarte ich, dass man sie nachliest und zu verstehen versucht. Wenn ich empfehle, nicht Convert.ToXxx zu verwenden, sondern Parse usw. vorschlage, hat das auch seinen Sinn. Wenn ich merke, dass meine Ratschläge nicht genutzt werden, verliere ich die Lust zu helfen (wie unter Buchstaben löschen von Text [http://www.c-sharp-forum.de/viewtopic.php?t=83188] gerade zu sehen ist.
Jürgen
Guennesack - Sa 17.05.08 18:18
danke danke danke, hat mir sehr weitergeholfen.
das programm läuft jetzt so wie ich es mir gewünscht habe.
ein großes lob an deine ausdauer JüTho.
mit besten gruß guennesack
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!