# String überprüfen, ob gültig, sonst wiederholung der eingabe



## Chrissicat (8. Dez 2010)

```
String datumString = "";

            System.out.println("Dieses Programm überprüft ein eingegebenes Datum im Zeitraum von 15.10.1582 - 05.12.2010");

            datumString = IOTools.readString("Geben Sie das zu überprüfende Datum im Format tt.mm.jjjj ein: ");
            //das Programm liest den String ein.
            char[] datum = datumString.toCharArray();
            for (int i = 0; i < datum.length; i++) {
            }
            while (datum[2] != '.' || datum[5] != '.') {                                                                              
                System.out.println("kein Datum eingegeben!");
                return;
            }
            while (datum.length != 10) {
                System.out.println("Fehler, kein Datumsformat.");
                return;
            }
```


ich bin blutige Anfängerin und bräuchte Ihre/eure hilfe!
das programm soll einen string einlesen, der auf gültigkeit überprüft wird.
leider darf ich bei meinem Programm nicht von einem "intelligenten Benutzer" ausgehen, deswegen soll der benutzer, sobald er ein datum nicht genau in diesem tt.mm.jjjj format eingibt, seine eingabe wiederholen können.
ich bring's nicht zusammen!
mein programm läuft, wenn der benutzer tt.mm.jjjj eingibt. aber das programm soll auch bei der eingabe von zB "slljsdf" nicht abstürzen.. wie sag ich das meinem programm? 
ich habs jetzt nur mal so ungefähr (wie unschwer zu erkennen ist )
vielen dank schon mal im vorraus!


----------



## eRaaaa (8. Dez 2010)

Schreibe dir doch einfach eine Methode die den String prüft und entweder true oder false zurückgibt, dann kannst du in einer do-while-Schleife immer die Methode mit der Eingabe aufrufen, bis die Eingabe eben korrekt ist.
ala

```
String date = null;
		do {
			date = //read input
		} while (!legalDate(date));
```

Mit Regex könntest du das übrigens viel einfacher überprüfen


----------



## vanny (8. Dez 2010)

also wenn die aufgabe darin besteht, den string zu parsen und ohne regex zu arbeiten, dann nimm die metode von eRaaaa und prüfe bitte auch, ob die eingegebenen chars auch integer sind.

//edit: im moment würde auch eine eingabe wie : fg.23.t5gh  als datum durchgehen.

Gruss Vanny


----------



## Chrissicat (9. Dez 2010)

das ist das 2. problem, das sich daraus ergibt: wie schaut die methode aus? hab noch nie eine methode gemacht

```
public static void checkDatum (args[] String) //oder wie nenn ich die methode besser?
 char[] datum = datumString.toCharArray();              
            if (datum.length != 10) {                              
                System.out.println("Fehler, kein Datumsformat.");
```

wie schaut das mit true und false aus? wie schreib ich das?


----------



## F.S.WhiTeY (9. Dez 2010)

Hallo,


```
public static void checkDatum (args[] String) //oder wie nenn ich die methode besser?
```

Warum (args[] String) als übergebene Parameter? Eine Methode sollte auch eine Methode sein, und keine Main-Method zugleich.

Du wirst es in der Zukunft einfacher haben, wenn du dich gleich mit der "Objektwelt" anfreundest.

Du machst erstmal zwei klassen. Eine mit der Main-Methode (public static void main(String[] args)) und eine mit deinen "Funktionen".

Dann machst du einen Objektaufruf deiner "Funktionenklasse" in der "Mainklasse". Hört sich schwer an, ist es aber nicht und zwingt dich von anfang an zum strukturiertem Programmieren. 

Wie sieht sowas aus ? Nun, hier mal ein Beispiel ohne dir die "Hausaufgaben" zu machen 

Wenn du Fragen dazu hast, frag einfach. Du kannst das Beispiel hier auch bei dir Laufen lassen. Dazu musst du allerdings oben den Packagenamen ändern oder einfach weglöschen.



Die Main Klasse:

```
package de.Hilfe_Fuer_Foren;

import java.io.IOException;

public class Beispiel_Main {
public static void main(String[] args) {
	
	Add addiere = new Add(); //Das ist der Objectaufruf der Klasse Add
	//Das daraus entstandene Objekt nennt sich dann addiere
	//Wie eine benannte Variable, nur das es die Klasse Add bereitstellt
	//aber auch nur die dienge, die als public deklariert sind
	//mit privat deklarierte Funktionen und Variablen wäre nicht sichtbar
	
	try {
		
		addiere.addTwoNumbers();//hier wird die Methode/Funktion addTwo Numbers
		//Aufgerufen. Sie stammt aus der Klasse Add
		
	} catch (IOException e) {
		
		e.printStackTrace();
	}
}
}
```

Die Klasse Add mit einer Methode


```
package de.Hilfe_Fuer_Foren;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Add {

	public int addTwoNumbers() throws IOException {
		
		System.out.println("Dieses Programm Addiert zwei Zahlen");
		int a;
		int b;
		int amount = 0;
		String tempString;

		BufferedReader bin = new BufferedReader(
				new InputStreamReader(System.in));

		System.out.println("Bitte die erste Zahl eingeben: ");
		tempString = bin.readLine();
		a = Integer.parseInt(tempString);
		System.out.println("Bitte die zweite Zahl eingeben: ");
		tempString = bin.readLine();
		b = Integer.parseInt(tempString);
		
		System.out.println("das ergebnis ist:" +(a+b));

		return amount;
	}

}
```


----------



## Chrissicat (10. Dez 2010)

```
public void checkDatum(String x) {
        char[] y = x.toCharArray();
        if (y.length != 9) {
            System.out.println("Fehler, kein Datumsformat!");
        }
        if (Character.isDigit(y[0])) {
        }
        if (Character.isDigit(y[1])) {
        }
        if (Character.isDigit(y[3])) {
        }
        if (Character.isDigit(y[4])) {
        }
        if (Character.isDigit(y[6])) {
        }
        if (Character.isDigit(y[7])) {
        }
        if (Character.isDigit(y[8])) {
        }
        if (Character.isDigit(y[9])) {
        }
        if (y[2] != '.' || y[5] != '.') {                                                                               //die Trennzeichen müssen vorhanden sein.
            System.out.println("kein Datum eingegeben!");
        }
        return;
```

so, aber das funktioniert natürlich nicht, so wie ich will.. bitte sagt mir, was fehlt? bzw wie viel 
eig funktionierts gar nicht.. ich hab das problem zwar beim methoden schreiben allgemein, aber DIESE methode klappt nicht.. ich brauch hilfe bei genau dieser methode...


----------



## XHelp (10. Dez 2010)

Die If-Abfragen sind ja völlig nutzlos, da die weder verschachtelt sind, noch passiert in dennen irgendwas.


----------



## eRaaaa (10. Dez 2010)

Deine Methode müsste in dem Fall natürlich auch etwas zurückgeben -> boolean, sonst kannst du es ja nicht so wie vorgeschlagen in der Schleife nutzen! Ausserdem hast du ein Problem wenn der User ein falsches Format eingibt und anstelle von 4 Jahreszahlen nur 2 eingibt --> Exception!
Was ich mich schon die ganze Zeit frage ist: sollst du wirklich nur kontrollieren ob das Format stimmt?
Also Zahl Zahl Punkt Zahl Zahl Punkt Zahl Zahl Zahl Zahl ? 
Dann könnte das in einer Zeile mit so etwas wie

```
public static boolean isLegalDate(String date){
		return date.matches("\\d{2}\\.\\d{2}\\.\\d{4}");
	}
```
gelöst werden, aber das ist ja noch lange kein gültiges Datum! Kann da ja Zahlen wie ich lustig bin übergeben! Ist das egal?


----------



## HoaX (10. Dez 2010)

Wie wäre es mit SimpleDateFormat#parse? Wenns nicht gültig ist einfach Exception abfangen, wird das einfachste und leserlichste sein imo.


----------



## Chrissicat (10. Dez 2010)

naja.. mal schauen, ob ich das noch schaffe..
mein programm rennt ja, wenn ich zahlen eingebe (egal welche, das programm muss ja entscheiden, ob es gillt), nur bei buchstaben hängt's sich auf.. soll halt wenn möglich "idiotensicher" geschrieben sein..


----------

