# Einzelne Ziffern aus einem String



## denis7788 (2. Feb 2010)

Hallo! Ich sitze hier gerade an einer methode die einzelne ziffern eines Strings miteinander addieren soll. zwischen den zahlen sollen auch trennzeichen erlaubt sein, wie - : / ... . ein bsp also: 123-432:123...
ich habs mit string tokenizer gemacht, aber nicht bedacht das dann 123+432+123 rauskommt... jetzt hab ich mit überlegt das man das mit while schleifen in denen man duch 10teilt und modulo 10 ermittelt die einzelnen ziffern bekommt. aber ich glaube das ist irgendwie umständlich. gibt es da ne andere möglichkeit?


----------



## fastjack (2. Feb 2010)

Wenn Du nur Ziffern addieren sollst, einfach den String in einer Schleife durchgehen. Jedes Zeichen nehmen, in eine Zahl umwandeln und zu einem Gesamtergebnis addieren. Natürlich nur Zeichen in [0-9] in Betracht nehmen, sonst wirds nix mit umwandeln.

Beispiel:


```
String s = "123aaa.456;7";
        int z = 0;
        for (int i = 0, n = s.length(); i < n; i++) {
            char c = s.charAt(i);
            switch(c) {
            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
                z += Integer.parseInt(String.valueOf(c));
                break;
            }
        }
        System.out.println(z == (1+2+3+4+5+6+7));
```

Den Vergleich kannst Du auch mit RegEx machen, wie gesagt, nur ein Beispiel.

Wenn der String aber ein mathematischer Ausdruck sein soll wirst Du nicht darum herum kommen, Dir einen Infix-Parser zu basteln. --> siehe Google.


----------



## Firestorm87 (2. Feb 2010)

Eventuell kann man auch den Scanner dahingehend nutzen?
Ansonsten...:

```
final String quelle = "123-432:123";
		final Pattern pattern = Pattern.compile("([0-9]{1})");
		final Matcher matcher = pattern.matcher(quelle);
		while (matcher.find()) {
			System.out.println(matcher.group());
		}
```


----------



## Michael... (2. Feb 2010)

denis7788 hat gesagt.:


> Hallo! Ich sitze hier gerade an einer methode die einzelne ziffern eines Strings miteinander addieren soll. zwischen den zahlen sollen auch trennzeichen erlaubt sein, wie *- : /* ... . ein bsp also: 123-432:123...


Also soll doch ein bisschen mehr gemacht werden als nur addieren??
Mit dem StringTokenizer kann man sich in den Tokens auch die Trennzeichen mit ausgeben lassen. Dann würde das ja wie folgt aussehen (sofern die Syntax des Strings korrekt ist):
1. Token: Zahl
2. Token: Rechenoperator
3. Token: Zahl
...
und man könnte durch Überprüfung der Rechenoperatoren, die jeweiligen Berechnungen durchführen.


----------



## fastjack (2. Feb 2010)

Dann spielt aber bestimmt auch die Wertigkeit der Operatoren eine Rolle ... wer weis ?


----------



## Firestorm87 (2. Feb 2010)

Wenn dazwischen wirklich nur rechenoperationen kommen hast du recht...
Allerdings würde das dann keinen Sinn machen das Stellenweise zu addieren 

Daher geh ich einfach von Trennstrichen etc aus (z.B. um von nem Key xxxx-xxxx-xx-xxxx ne Quersumme zu bilden)


----------



## denis7788 (2. Feb 2010)

die trennzeichen sind nicht als operatoren gedacht... also denke die switch anweisung wäre dann am sinnvollsten... ich probiers dann mal so aus.. thx!!!


----------



## Firestorm87 (2. Feb 2010)

Den schönheitspreis gewinnste eher mit der Reg-Ex variante (Da auch erweiterbar)  Aber funktionieren tut beides


----------



## fastjack (2. Feb 2010)

Hast Glück gehabt, sparst Dir nen Infix-Parser zu implementieren.



			
				Firestorm87 hat gesagt.:
			
		

> (Da auch erweiterbar)



Falls es mal irgendwann mehr Ziffern geben sollte, als 0-9  (Spaß)


----------



## denis7788 (2. Feb 2010)

ja geht so . sieht aber hässlich aus, da ich für jedes case die anweisung schreiben muss weil nicht festgelegt ist an welchen positionen die trennzeichen liegen und ich die erste ziffer mit 10 , die zweite ziffer mit 9(letzte mit 1) usw multiplizieren muss. regex kenne ich noch nicht.. bin auch unter zeitdruck.. oder is das easy?


----------



## sign (2. Feb 2010)

Weiss nicht ob ich das Problem richtig verstanden hab. ???:L


```
String s = "123aaa.456;7";
s = s.replaceAll("\\D", "");
int q = 0;        

for (int i=0; i<s.length(); i++){
   q += Character.getNumericValue(s.charAt(i));
}

System.out.println(q);
```

lg


----------

