# EAN-13-Prüfziffer: Vermeiden von Eingaben mit mehr/weniger als 12 Ziffern



## Haave (10. Mai 2010)

Hallo,

ich bin ein blutiger Anfänger in Java, habe meine ersten Erfahrungen mit dem Java-Hamster-Modell gesammelt und möchte mich jetzt verstärkt an "echtem" Java versuchen.

Heute habe ich ein kleines Programm geschrieben, das bei einer EAN-13 die Prüfziffer berechnet (untenstehend der Code, kompilier- und ausführbar). Das Programm liefert das richtige Ergebnis, wenn - wie vorgesehen - eine 12-stellige Zahl eingegeben wird (wahrscheinlich kein besonders schöner Stil, das mit einem long zu machen, aber ich wusste mir nicht anders zu helfen  ). Es berechnet jedoch auch einen Wert, wenn eine Zahl eingegeben wird, die kürzer oder länger als 12 Zeichen ist; eine solche Eingabe würde ich gern verhindern und eine entsprechende Meldung ausgeben lassen ("Die eingegebene Nummer ist zu kurz/lang. Bitte geben Sie eine 12-stellige Zahl ein" etc.), aber ich weiß nicht, wie man das umsetzen würde. Mir geistert etwas mit Exceptions im Kopf herum, aber vielleicht bin ich da auch völlig auf dem Holzweg…
Kann mir jemand helfen?



```
import java.util.Scanner;

public class EANPruefziffer {

	static long[] ziffern = new long[12];
	
	public static void main(String[] args) {
		System.out.println("Bitte geben Sie die Artikelnummer ein (in der Form 123456789012).");
		System.out.println("Die Artikelnummer besteht aus den ersten 12 Stellen des EAN-Codes ohne die Pruefziffer.");
		einlesen();
		int ergebnis = rechnung();
		ergebnis = ergebnis % 10;
		ergebnis = 10 - ergebnis;
		if(ergebnis == 10) {
			System.out.println("Die Pruefziffer fuer die eingegebene Artikelnummer lautet 0.");
		} else System.out.println("Die Pruefziffer fuer die eingegebene Artikelnummer lautet " + ergebnis + ".");
	}
	
	public static void einlesen() {
		//die Ziffern werden in umgekehrter Reihenfolge in das Array eingelesen
		Scanner s = new Scanner(System.in);
		long speicher = 0;
		speicher = s.nextLong();
		for(int i = 0; i < ziffern.length; i++) {
			ziffern[i] = speicher % 10;
			speicher /= 10;
		}
	}
	
	public static int rechnung() {
		for(int j = 0; j < ziffern.length; j += 2) {
			ziffern[j] = ziffern[j] * 3;
		}

//		Wird nicht benoetigt, steht nur der Vollstaendigkeit halber drin
//		for(int k = 1; k < ziffern.length; k += 2) {
//			ziffern[k] = ziffern[k] * 1;
//		}

		int summe = 0;
		for(int l = 0; l < ziffern.length; l++) {
			summe = summe + (int)ziffern[l];
		}
		return summe;
	}
}
```


----------



## MarderFahrer (10. Mai 2010)

Bevor du in Zeile 24 dein Array mit den eingegebenen Ziffern füllst, könntest du die Länge des eingegebenen Wertes prüfen. z.B könntest du den Long Wert in eine teporäre String Variable packen. Aus dieser String Variable dann mit ".length()" die Länge ermitteln.
Dann bräuchtest du nur noch eine Ausgabe machen, die entsprechend der Länge ausfallen.
<12 "Eingabe zu kurz"
>12 "Eingabe zu lang"
=12 -> Weiter im Programmablauf


----------



## FArt (10. Mai 2010)

How to Use the Focus Subsystem (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Other Swing Features)


----------



## Haave (11. Mai 2010)

Ich habe es mal mit der von MarderFahrer vorgeschlagenen Lösung versucht (mit dem InputVerifier komme ich zugegebenermaßen nicht ganz zurecht ._.). Die Prozedur einlesen() sieht nun wie folgt aus:


```
public static void einlesen() {
		//die Ziffern werden in umgekehrter Reihenfolge in das Array eingelesen
		Scanner s = new Scanner(System.in);
		long speicher = 0;
		speicher = s.nextLong();
		
		String pruefstring = new String();
		pruefstring = "" + speicher;
		if(pruefstring.length() == 12) {
			for(int i = 0; i < ziffern.length; i++) {
				ziffern[i] = speicher % 10;
				speicher /= 10;
			}
		} else {
			System.out.println("Die eingegebene Nummer hat nicht die richtige Laenge.");
			System.out.println("Bitte ueberpruefen Sie Ihre Eingabe und versuchen Sie es noch einmal.");
			einlesen();
		}
	}
```

Für Zahlen kleiner als 12 Stellen sowie zwischen 13 Stellen und der größtmöglichen Long-Zahl geht es nun (und im Normalgebrauch ist wohl eher nicht davon auszugehen, dass eine Zahl wie "999999999999999999999999" eingegeben wird; es geht ja eher darum, Tippfehler abzufangen). Ich kann mich ja nochmal dransetzen und schauen, wie das mit dem InputVerifier geht (und ob man ihn auch bei Nicht-GUI-Programmen benutzen kann), aber vorerst sollte die Frage geklärt sein 

Vielen Dank für eure Hilfestellung!


----------

