# Prüfziffer erstellen



## steffal996 (18. Apr 2017)

Hallo ihr Lieben!
Ich habe ein kleines Problem wo ich nicht weiter komme.

Ich habe einen String, bei diesem soll jeder Buchstabe einen Wert bekommen, also A = 1, B = 2, usw.
Diese werden zusammenaddiert und der ganzzahlige Rest einer Division der Summe durch 16 wird als Prüfziffer angehängt. Da hierbei Werte von 0 bis 15 auftreten können, wird anstelle einer Dezimalziffer die entsprechende Hexziffer angehängt.

Mein Gedanke war aus dem String ein char-Array zu machen und anschließend in einer for schleife das Alphabet hochzuzählen...aber an der Ausführung scheitere ich noch.

Über hilfe wäre ich sehr dankbar!


----------



## stg (18. Apr 2017)

Das String-Objekt beinhaltet schon ein solches char-Array, wie du es suchst. Auf einzelne chars des Strings kannst du mit charAt zugreifen


----------



## steffal996 (19. Apr 2017)

Ich habe jetzt versucht es auf diese art zu lösen, aber leider läuft dann gar nichts.. wo ist der fehler?


```
String kurzbartnr = s + String.format("%04d", nummer%10000);

        int summe = 0;
        int summe1 = 0;
        int summe2 = 0;
        int zahl1 = 0;
        int zahl2 = 0;
       
        for(int i = 0; i <=kurzbartnr.length(); i++){
            if(Character.isDigit(kurzbartnr.charAt(i))){
                zahl1 = kurzbartnr.charAt(i)- '0';
                summe1 = summe1 + zahl1;
            }
            else {
            zahl2 = kurzbartnr.charAt(i)-'A' + 1;
            summe2 = summe2 + zahl2;
        }
        summe = summe1 + summe2;
        }
       
        int rest = summe % 16;

        String pruefziffer = Integer.toHexString(rest);
       
        String kurzbezeichnung = kurzbartnr + pruefziffer.toUpperCase();
       
        return kurzbezeichnung;
    }
```


----------



## VfL_Freak (19. Apr 2017)

Moin,


steffal996 hat gesagt.:


> aber leider läuft dann gar nichts..


was heißt denn das konkret? 



steffal996 hat gesagt.:


> wo ist der fehler


Welcher Fehler? Stacktrace ?? 

Irgendwie ist Dein Code oben nicht sonderlich vollständig ... Dein RETURN (plus schließende Klammer) fällt irgendwie vom Himmel !! 

Gruß Klaus


----------



## steffal996 (19. Apr 2017)

Sorry hier die komplette Methode zur erzeugung einer Kurzbezeichnung die aus einer Bezeichnung erzeugt werden sollte, aus dieser Bezeichnung 8 stellen nimmt, anschließend 4 stellen aus der Artikelbezeichnung und 1 Prüfziffer die sich wie oben geschildert aus der Kurzbezeichnung und den vier Stellen der Artikelbezeichnung bilden soll.

```
public static String erzeugeKurzbezeichnung(int nummer, String bezeichnung) {

        String s = bezeichnung.replaceAll("ß", "s").toUpperCase();
        s = s.replaceAll("[aeouiAEOUIöäüÖÄÜ-]", "");
        s = s.replaceAll("\\s+", "");
        s = s.replaceAll("\\W", "");

        if(s.length() > 8){
            s = s.substring(0, 8);
        }

        String kurzbartnr = s + String.format("%04d", nummer%10000);

        int summe = 0;
        int summe1 = 0;
        int summe2 = 0;
        int zahl1 = 0;
        int zahl2 = 0;
      
        for(int i = 0; i <=kurzbartnr.length(); i++){
            if(Character.isDigit(kurzbartnr.charAt(i))){
                zahl1 = kurzbartnr.charAt(i)- '0';
                summe1 = summe1 + zahl1;
            }
            else {
            zahl2 = kurzbartnr.charAt(i)-'A' + 1;
            summe2 = summe2 + zahl2;
        }
        summe = summe1 + summe2;
        }
      
        int rest = summe % 16;

        String pruefziffer = Integer.toHexString(rest);
      
        String kurzbezeichnung = kurzbartnr + pruefziffer.toUpperCase();
      
        return kurzbezeichnung;
    }
```
Und das ist seine Fehlermeldung:

```
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 12
    at java.lang.String.charAt(String.java:658)
    at Artikel.erzeugeKurzbezeichnung(Artikel.java:67)
    at Artikel.getKurzbezeichnung(Artikel.java:29)
    at Artikel.toString(Artikel.java:89)
    at java.lang.String.valueOf(String.java:2994)
    at java.io.PrintStream.println(PrintStream.java:821)
    at Artikel.main(Artikel.java:97)
```


----------



## VfL_Freak (19. Apr 2017)

Moin,

nutze bitte die Code-tags, so bekommt man ja Augenkrebs 

Der Fehler liegt hier: _*at java.lang.String.charAt(String.java:658)*_, allerdings weiß keiner, was genau Zeile 658 ist!

Eventuell aber dies hier:
_*for(int i = 0; i <=kurzbartnr.length(); i++){*_
Du solltest hier nur bis "< länge" durch laufen !!

Gruß Klaus


----------



## steffal996 (19. Apr 2017)

entschuldigung ganz vergessen 
ja das wars, klasse danke!!


----------



## mrBrown (19. Apr 2017)

Allerdings dürfte die Prüfziffer trotzdem falsch berechnet werden.


----------



## steffal996 (19. Apr 2017)

wieso?
Ich bekomm alle ausgaben so wie sie sein sollten


----------

