# Bestimmte Ziffer



## babuschka (20. Jan 2012)

Hallo, ich habe eine kurze Frage, die ich trotz Recherche nicht selbst klären konnte:


Gibt es eine Methode, die einem  die n-te Ziffer einer Integer-Zahl liefert?

Also ich übergebe zum Beispiel 123 (Integer) und will die erste Ziffer (1) haben.


Gibt's sowas?


----------



## Marco13 (20. Jan 2012)

Zusammenhang? 
int value = 123;
int digit0 = (value / 100) % 10; // 1
int digit1 = (value / 10) % 10; // 2
int digit2 = (value / 1) % 10; // 3

Ggf. tut's bei dir auch irgendwas mit Strings...


----------



## Andi_CH (20. Jan 2012)

Die plumpe Version:


```
int wert = 123;
		String str = Integer.toString(wert);
		System.out.println(str.charAt(0));
```

Geht natürlich auch als Einzeiler ...

EDIT - och resultat als int:


```
int stelle = Integer.parseInt(""+str.charAt(0));
```


----------



## babuschka (20. Jan 2012)

Also es dreht sich um Folgendes:

Ich möchte eine Methode printDigits(int n) implementieren: Diese soll die einzelnen Ziffern einer gegebenen Zahl n als Text ausgeben (Vorzeichen sollen ignoriert werden):

Beispiel: Aufruf von printDigits(2012) soll ausgeben: Zwei Null Eins Zwei

Da wir gerade das Thema "rekursive Methoden" haben, wollte ich das gerne rekursiv implementieren.

Dazu habe ich mir sowas überlegt:


```
public printDigits(int n){

//Behandlung der Trivialfälle

switch( n )
{
 case 0: System.out.println("Null"); break;

 case (1 || -1): System.out.println("Eins"); break;

 case (2 || -2): System.out.println("Zwei"); break;

 case (3 || -3): System.out.println("Drei"); break;

 case (4 || -4): System.out.println("Vier"); break;

 case (5 || -5): System.out.println("Fuenf"); break;

 case (6 || -6): System.out.println("Sechs"); break;

 case (7 || -7): System.out.println("Sieben"); break;
 
 case (8 || -8): System.out.println("Acht"); break;

 case (9 || -9): System.out.println("Neun"); break;
}

// Nicht-triviale Fälle (eigentliche Rekursion)

System.out.println( printDigits( erste Ziffer von n) + printDigits (n ohne die erste Ziffer) );

}
```


Zeile 30 kann ich bis jetzt nur verbal beschreiben, denn ich weiß nicht, wie ich auf die erste Ziffer der Zahl n zugreifen kann, diese dann abtrennen kann und die übriggebliebenen Ziffern bekomme.


Meine Frage ist also aus Zeile 30 heraus entstanden.


----------



## SlaterB (20. Jan 2012)

```
int stelle = str.charAt(0)-'0';
```


----------



## Marco13 (20. Jan 2012)

Andi_CH hat gesagt.:


> ```
> int stelle = Integer.parseInt(""+str.charAt(0));
> ```



Könnte man so machen. 

Hach, wenn Java nur nicht so langsam wäre  :joke:

Zur Rekursion: Mit
int zahl = 123;
int letzteZiffer = zahl % 10;
bekommt man immer die letzte Ziffer. Vielleicht kannst du darauf aufbauend die Rekursion basteln (es ist vermeintlich einfacher, die Ziffern rückwärts auszugeben, aber das ist nur abhängig von der Reihenfolge zweier Zeilen)


----------



## babuschka (20. Jan 2012)

Okay, dann würde ich erstmal die Version machen, die die Ziffern in umgekehrter Reihenfolge als Text ausgibt:

printDigitsReversed(2012) soll also ausgeben: Zwei Eins Null Zwei


Dann habe ich in Zeile 30 stehen:

System.out.println( printDigitsReversed( n % 10 ) + " " + printDigitsReversed( n ohne letzte Ziffer) );


Wie kriege ich n ohne die letzte Ziffer?

(Habe das noch nicht so verstanden.)


----------



## xehpuk (20. Jan 2012)

Durch 10 teilen.


----------



## babuschka (20. Jan 2012)

Achso!! Weil es int ist wird die Nachkommastelle ja nicht beachtet...


----------



## Andi_CH (20. Jan 2012)

[STRIKE]Wie wärs mit abzählen und durch 10 dividieren???[/STRIKE]  zu spät ;-)

Egal ich bleib bei String


```
package com.javaforum;

public class Test {

	public static void translateDigit(char digit) {
		switch (digit) {
		case '0':
			System.out.print("null ");
			break;
		case '1':
			System.out.print("eins ");
			break;
		case '2':
			System.out.print("zwei ");
			break;
		case '3':
			System.out.print("drei ");
			break;
		case '4':
			System.out.print("vier ");
			break;
		case '5':
			System.out.print("fuenf ");
			break;
		case '6':
			System.out.print("sechs ");
			break;
		case '7':
			System.out.print("sieben ");
			break;
		case '8':
			System.out.print("acht ");
			break;
		case '9':
			System.out.print("neun ");
			break;
		}
	}

	public static void printFirstDigit(String number) {
		translateDigit(number.charAt(0));
		if (number.length()>1) {
			printFirstDigit(number.substring(1));
		}
	}
	public static void main(String[] args) {
		int i = 123;
		printFirstDigit(Integer.toString(i));
	}
}
```


----------



## Andi_CH (20. Jan 2012)

translate kann natürlich beliebig erweiter werden ...


```
case '-':
			System.out.print("minus ");
			break;
		case '.':
		case ',':
			System.out.print("komma ");
			break;
		case '^':
			System.out.print("hoch ");
			break;
```


----------



## babuschka (20. Jan 2012)

Irgendwie bekomme ich es nicht richtig aufgeschrieben:


```
public class Digits{


public void printDigitsReversed(int n){

//Behandlung der Trivialfälle

switch( n )
{
 case 0: System.out.println("Null "); break;

 case 1: System.out.println("Eins "); break; 
 

 case 2: System.out.print("Zwei "); break;

 case 3: System.out.print("Drei "); break;

 case 4: System.out.print("Vier "); break;

 case 5: System.out.print("Fuenf "); break;

 case 6: System.out.print("Sechs "); break;

 case 7: System.out.print("Sieben "); break;
 
 case 8: System.out.print("Acht "); break;;

 case 9: System.out.print("Neun "); break;
}

System.out.println( printDigitsReversed( n % 10 ) + printDigitsReversed( n/10 ) );


}

}
```

Aber erstens fehlt noch, daß das Vorzeichen egal ist und zweitens kommen diese Fehlermeldungen (s. Screenshot).


----------



## Andi_CH (20. Jan 2012)

Ist ja logisch!
Du ewartest dass printDigitsReversed etwas zurück gibt, das man mit + verknüfen und dann an sysout übergenben.

Bei printDigitsReversed steht aber void!

statt

```
System.out.println( printDigitsReversed( n % 10 ) + printDigitsReversed( n/10 ) );
```
Machst du einfach


```
printDigitsReversed( n % 10 );
printDigitsReversed( n/10 );
```

und es wird gehen

So nebenbei, hat das schon mal jemand in der vollen Komplexität gelöst?

12243 = Zwölftausenddreihundertzweiunddvierzig ?
What's about 1200 = Zwölfhundert (die einen sprechen das so aus)


----------



## insane80 (20. Jan 2012)

Hallo.

Das mit dem Vorzeichen könntest Du mir 
	
	
	
	





```
Math.abs()
```
 lösen.


----------



## babuschka (20. Jan 2012)

Ich habe es jetzt so implementiert:


```
public class Digits{


public String printDigitsReversed(int n){

int m = Math.abs(n);	
	
//Behandlung der Trivialfälle

switch( m )
{
 case 0: return "Null ";

 case 1: return "Eins "; 
 

 case 2: return "Zwei ";
 case 3: return "Drei "; 

 case 4: return "Vier "; 

 case 5: return "Fuenf "; 

 case 6: return "Sechs "; 

 case 7: return "Sieben "; 
 
 case 8: return "Acht "; 

 case 9: return "Neun "; 
}

String s=new String();

s+= printDigitsReversed( m % 10) + printDigitsReversed( m/10 );



return s;

}

}
```


Nur, die Methode soll ja etwas ausgeben...

Jetzt macht sie das noch nicht.


----------



## SlaterB (20. Jan 2012)

schreibe nie [c]new String()[/c], null oder "" dürften reichen


wenn du was ausgeben willst dann System.out.prinln, oder? hattest du ja schonmal,
String zurückgeben und den Aufrufer etwas ausgeben zu lassen kann aber schlauer sein


----------



## insane80 (20. Jan 2012)

Die Methode gibt Dir einen String zurück, den kannst Du dann ja z. B. mit 
	
	
	
	





```
System.out.println(printDigitsReversed(5))
```
 ausgeben


----------



## babuschka (20. Jan 2012)

Aber wo baue ich das System.out.println ein?

In die Methode gar nicht sondern dann mal irgendwann anders, wenn ich die Methode aufrufe?

Oder muss ich einmal das bei jedem case machen und auch am Ende nochmal?


----------



## insane80 (20. Jan 2012)

Wo Du es eben brauchst bzw. haben willst. ;-) 
Kannst Du z.B. in der main-Methode machen.


----------



## babuschka (20. Jan 2012)

Wie meinst Du das mit der main-Methode?


Also irgendwie stehe ich wohl mal wieder auf dem Schlauch.

Wenn ich printDigitsReversed(2009) aufrufe, so wird ja bei mir der String zurückgegeben,

in der Aufgabe steht aber, daß der Aufruf printDigitsReversed(2009) zur Ausgabe 

Neun Null Null Zwei


führen soll.


Missverstehe ich da was? Aber das macht die Methode doch jetzt nicht.


----------



## insane80 (20. Jan 2012)

Na ja, Dein Programm wirst Du ja in der main-Methode starten.

Also z.B.:


```
public static void main(String[] args) {
        Digits d = new Digits();
        System.out.println(d.printDigitsReversed(2009));
}
```

Ausgabe: 
	
	
	
	





```
Neun Null Null Zwei
```


----------



## babuschka (20. Jan 2012)

Ja, das verstehe ich.

Aber genau genommen, ist doch dann die Formulierung der Aufgabe nicht korrekt. 

Denn die Methode hat ja nicht zur Folge, daß diese Ausgabe passiert, sondern gibt den String zurück.


----------



## babuschka (20. Jan 2012)

Um ehrlich zu sein, sehe ich immer noch nicht, wie ich die Zahl jetzt in der richtigen Reihenfolge in Text umwandeln kann.

In der Azufgabe heißt es:

"Beide Funktionen sind nahezu identisch. Beschreibe den Unterschied und seine Wirkung."


----------



## insane80 (20. Jan 2012)

Ist das wirklich so ein Problem, dass ein String zurückgegeben wird und der nicht direkt in der Methode ausgegeben wird?
Der Vorteil ist, dass Du den String woanders verwenden kannst, z.B. auch in einer GUI ;-)


----------



## babuschka (20. Jan 2012)

danke.


----------



## insane80 (20. Jan 2012)

Klar, kein Problem. 
Auf die Lösung wärst Du bestimmt auch so gekommen


----------



## babuschka (20. Jan 2012)




----------



## Marco13 (20. Jan 2012)

Andi_CH hat gesagt.:


> So nebenbei, hat das schon mal jemand in der vollen Komplexität gelöst?
> 
> 12243 = Zwölftausenddreihundertzweiunddvierzig ?
> What's about 1200 = Zwölfhundert (die einen sprechen das so aus)



Da war kürzlich ein Thread dazu, es gibt wohl irgendeine Apache(???) Lib die das kann, auch konfigurierbar für deutsch und englisch und so... ansonsten macht das aus http://www.java-forum.org/java-basics-anfaenger-themen/101353-int-string-umwandeln.html#post645321 halt aus einer Zahl wie 9223372036854775807 einen String wie "neun Trillionen zweihundertdreiundzwanzig Milliarden dreihundertzweiundsiebzig Billionen sechsunddreißig Milliarden achthundertvierundfünfzig Millionen siebenhundertfünfundsiebzigtausend achthundertsieben"


----------

