Aufgabe 1106 Maskdate: Datum formatieren Teil der ersten Übungsrunde "AU Einführung in das Programmieren" an der TU-Wien Autor: Starzinger Michael, <e0306126@student.tuwien.ac.at> Datum: Dienstag, 21. Oktober 2003 ------------------------------------------------------------------------------------- --> Aufgabenstellung: Die Aufgabe war es, ein Programm zu schreiben welches ein Datum in einem bestimmten Format einließt (DD-MM-YYYY oder DD/MM/YYYY) und es anhand eines beinahe beliebigen Format-Strings umformatiert. (Details siehe Spezifikation) --> Implementation und Wiederverwendbarkeit: Die hier vorgestellte Implementation besteht aus zwei Klassen. Einmal aus dem Programm selbst ('Maskdate') welches nur die nötige main()-Methode aufweist. Und zum zweiten der Klasse 'DateFormatExt' welche die eigentlichen Methoden zur Formatierung des Datums bereitstellt. Diese zweite Klasse kann leicht in anderen Prgrammen wiederverwendet werden. Ich habe mich dazu entschlossen den Aufruf möglichst simpel zu gestallten. So erreicht man mit einem simplen Aufruf von "DateFormatExt.getFormattedDate()" das gewünschte Ergebnis. (zur genauen Beschreibung der Methode siehe unten!) Es sind alle Methoden der Klasse 'public', obwohl nur die gerade erwähnte benötigt wird. Dies soll die Wiederverwendebarkeit noch um einen Grad steigern. --> Fehlerbehandlung: Die Funktion "getFormattedDate()" ist in der Lage auf fehlerhafte Eingaben zu reagieren. Das heisst, sie löst eine Exception vom Typ "EprogException" aus falls Fehler in den Eingabedaten vorliegen. Ob diese Exception in Ihrem Programm abgefangen wird oder nicht bleibt Ihnen überlassen. --> Methoden: Es folgt eine Liste der Methoden der Klasse "DateFormatExt" (*) boolean checkDateStr(String date, String pattern) BEMERKUNG: Der Datums-String wird Anhand des mitgelieferten Patterns auf korrektheit untersucht. Beide Strings werden zeichenweise verglichen. Wobei ein "x" im Pattern symbolisiert, dass an dieser Stelle eine Ziffer im Datum enthalten sein muss. Jedes andere Zeichen (ausser dem "x") muss im Datum exakt enthalten sein. Somit führt ein Aufruf mit dem Pattern "xx-xx-xxxx" zu einem der zwei gewünschten Datums-Formate. OUTPUT: Liefert 'true' falls das Pattern stimmt, 'false' wenn ein Fehler erkannt wurde. Es wäre ohne weitere möglich statt eines Boolean-Wertes auch die Position des Fehlers zurückzugeben. Dies liese sich mit wenigen Modifikationen bewerkstelligen, ist jedoch in diesem Beispiel überflüssig. (*) boolean checkDate(int day, int month, int year) BEMERKUNG: Führt einen Plausibilitäts-Check der eingegebenen Zahlen durch. Dabei werden Bereichsüberprüfungen durchgeführt (zB 0<month<=12). Es wird ebenso erkannt ob die Tag-Monat Kombination zulässig ist (zB 31.Nov nicht gültig). Es wird sogar auf ein Schaltjahr bei der Überprüfung des Februars berücksichtigt. INPUT: Das zu prüfende Datum. Die Notation dürfte selbsterklärend sein, alle Zahlen beginnen bei 1 (als zB 1 für Januar). OUTPUT: Hier ebenso 'true' für Datum gültig, 'false' falls ungültig. (*) boolean isLeap(int year) INPUT: Die übergebene Jahreszahl wird auf ein Schaltjahr (leap vom englischen 'leap year' für Schaltjahr) geprüft. OUTPUT: 'true': ist Schaltjahr, 'false' ist kein Schaltjahr (*) String getDayName(int day) / getMonthName(int month) / ... INPUT: Der Tag/Monat muss dieser Methode als Zahl übergeben werden. Dabei ist zu beachten, dass hierbei von 0 zu zählen begonnen wird! OUTPUT: Den String der den entsprechenden Namen in englischer Sprache und Großbuchstaben enthält. (*) byte getDayOfWeek(int d, m, y) INPUT: Das Datum in gewohnter Notation, also Tag, Monat und Jahr als Zahl. OUTPUT: Eine Zahl die den Wochentag repräsentiert, wobei 0=Sonntag. BEMERKUNG: Auch hier werden alle Schaltjahre in Betracht gezogen. (*) String getFormattedNumeric(int numeric, int count) INPUT: Ein numerischer Wert und die gewünschte Anzahl der Stellen OUTPUT: Ein String der genau 'count' Zeichen enthält (*) String getFormattedDate(String date, String format) INPUT: Das Datum und der Format-String wie in der Spezifikation definiert als String. OUTPUT: Einen formatierten String laut Definition, wenn die Eingabedaten korrekt waren. BEMERKUNG: Sollte ein Fehler auftreten wird die Exception 'EprogException' ausgelöst. Eine kleine Beschreibung kann dann mit 'e.getMessage()' abgerufen werden. Die Fehlerbeschreibungen sind nicht sonderlich aussagekräftig, was daran liegt, dass sie in meinem Beispielprogramm nicht zur verwendung kommen. --> Weitere Fragen? Sollten weitere Fragen bestehen, so verweise ich auf den Quellcode oder die Möglichkeit mir eine eMail zu schreiben. -------------------------------------------------------------------------------------