# Aus int-Zahl bestimmte Stelle rausgreifen



## digitalspecht (23. Oktober 2004)

Hi Leutz,

habe ein kleines dummmes Problem. Ich habe eine siebenstellige int-Zahl und will, dass jeweils die erste Stelle, die zweite Stelle... einer eigenen Variablen zugeordent werden soll. Wie bekomme ich nun die jeweilige Ziffer der Stelle heraus?

Gruß,
Digi


----------



## Snape (23. Oktober 2004)

Moin,
ist vielleicht von hinten durch die Brust ins Auge, aber ich würde den int in einen String umwandlen, dann einen Substring von einem Zeichen Länge des gewünschten Indexes auslesen und diesen dann wieder zurück in ein int wandeln.


----------



## digitalspecht (23. Oktober 2004)

Das habe ich auch schon versucht, aber irgendwie kamen irgendwelche dummen Fehlermeldungen. Wie bekomme ich denn einen int-Wert in einen String bzw. wieder zurück? Da muss ich doch Casten oder so?


----------



## Snape (23. Oktober 2004)

RTFAPI 
(Read the fucking API)

Klasse Integer:
static int parseInt(String s)

Klasse String:
static String valueOf(int i)
String substring(int beginIndex, int endIndex)


----------



## Thomas Darimont (23. Oktober 2004)

*räusper*


```
public class Test08 {
	public static void main(String[] args) {
		int zahl = 1115111;
		int log = (int)Math.log10(zahl);
		for(int i = 0; i <= log; i++){
			System.out.println(getFigure(zahl, i,log));
		}
	}
	private static int getFigure(int zahl, int i,int log) {
		return (int) ((zahl / Math.pow(10.0, log - i))) % 10;
	}
}
```

Gruß Tom


----------



## digitalspecht (23. Oktober 2004)

Also mit dem langen Quelltext kann ich kaum was anfangen. 
Naja, ich denke, dass ich eine eigene (leichtere) Methode dafür gefunden habe. 
Nur hängt es noch an einem kleinen Fehler.

```
produkt = jahr1 * jahr2;
String s = String.valueOf(produkt);
String s1 = s.charAt(0);		// Hier kommt Fehlermeldung: incompatible types - found char but expected java.lang.String
String s2 = s.charAt(1);
.
.
.
int i1 = (int) s1;
int i2 = (int) s2;
.
.
.
```

Dachte mit ich müsste "java.lang.* bzw. java.lang.String" importieren, aber das hilft nicht. Eigentlich habe ich durch "valueOf" doch aus dem Integer einen String gemacht, oder?
Und kann mir jemand sagen, ob das mit "int i1 = (int) s1" funktionieren wird, da ich bis dahin noch nicht gekommen bin.
Thx,
Digi


----------



## Snape (23. Oktober 2004)

digitalspecht hat gesagt.:
			
		

> Also mit dem langen Quelltext kann ich kaum was anfangen.
> Naja, ich denke, dass ich eine eigene (leichtere) Methode dafür gefunden habe.
> Nur hängt es noch an einem kleinen Fehler.
> 
> ...



Ouch... was habe ich denn oben geschrieben? charAt(...)? Nein, sondern:

String substring(int beginIndex, int endIndex)

Also:

```
produkt = jahr1 * jahr2;
String s = String.valueOf(produkt);
String s1 = s.substring(0, 0);
String s2 = s.substring(1, 1);
.
int i1 = Integer.parseInt(s1);
int i2 = Integer.parseInt(s2);
.
```


----------



## Thomas Darimont (23. Oktober 2004)

Hallo!

Die andere Methode (mit dem Logarithmus) funktioniert auch und ist mit Sicherheit um ein vielfaches schneller als diese hier:


```
public class NumberExtractor {

	public static void main(String[] args) {
		int num = 4934567;
		String s = String.valueOf(num);
		char c0 = s.charAt(0);
		char c1 = s.charAt(1);
		
		int n0 = c0 - '0';
		int n1 = c1 - '0';
		
		System.out.println("Ziffer0: " + n0);
		System.out.println("Ziffer1: " + n1);
	}
}
```

Gruß Tom


----------



## RedWing (23. Oktober 2004)

Oder mit ganzzahliger Division


```
1 import java.lang.String;
      2 
      3 class versuch{
      4 
      5         public static void main(String[] args){ 
      6 
      7                 long number=1234567;
      8                 long mod = (long)Math.pow(10, Long.toString(number).length() - 1);
      9                 while(mod != 0){
     10                       
     11                         System.out.println(number / mod);
     12                         number = number - mod * (number / mod);
     13                         mod = mod / 10;
     14                 }
     15         }
     16 }
```

Gruß

RedWing


----------



## Thomas Darimont (23. Oktober 2004)

Hallo!



			
				RedWing hat gesagt.:
			
		

> Oder mit ganzzahliger Division
> RedWing



Das steckt doch alles hier drin: http://www.tutorials.de/forum/showpost.php?p=912613&postcount=5

Damit konnte der OP aber leider nichts anfangen.

Gruß Tom


----------



## RedWing (23. Oktober 2004)

Sorry hab ich übersehen   

Insebsondre kannte ich die log10 Methode noch nicht scheint wohl 
ne Methode aus der 1.5er API zu sein?

Gruß

RedWing


----------



## Thomas Darimont (24. Oktober 2004)

Hallo!

Jap log10 gibts erst seit 5.0.
Es ist aber nicht schwer seinen eigenen 10er Logarithmus zu implementieren:

```
public class LogTest {

	private final static double LN_10 = Math.log(10.0D);

	public static void main(String[] args) {
		System.out.println(log10(10000)); // 4
	}

	private static double log10(double i) {
		return Math.log(i) / (LN_10);
	}
}
```

Gruß Tom


----------



## squeaker (24. Oktober 2004)

Ein schnellkurs Mathematik - wie praktisch.

Der Zehnerlogarithmus liefert die Anzahl der Stellen einer Zahl im Dezimalsystem - mal ganz grob (sprich abgerundet) gesagt. Der 2er Logarithmus würde das zu einer Zahl im Dualsystem liefern und der natürliche Logarithmus zu einer Zahl mit der Basis e (Eulersche Zahl).


```
private static int getFigure(int zahl, int i,int log) {
		return (int) ((zahl / Math.pow(10.0, log - i))) % 10;
}
```
Dieser Codeabschnitt liefert die Dezimalstelle. Dabei wird die Zahl durch die 10er Potenz der Stelle geteilt, die man haben will.

11511 teilt man also durch 100 wenn man die 5 haben will. Das Resultat ist: 115.11. Das ganze wird Modulo 10 genommen (% 10), d.h. man bestimmt den Rest, wenn man durch 10 teilt. Der Rest einer Division durch 10 ist die letzte Stelle vor dem Komma plus alles was danach kommt. Im Beispiel 5.11. Das ganze wird dann nach (int) gecastet was ein wegschneiden der Nachkommastellen zur Folge hat. Das Resultat ist 5.
Ich hoffe das hat jetzt jeder Verstanden.

nun der Logarithmus. Vor Java 5 gibt es nach Thomas nur den natürlichen Logarithmus. Jetzt gilt aber glücklicherweise: log10(zahl) = log(zahl)/log(10). Geht mit jedem anderen Logarithmus auch, d.h. ld(zahl)=log(zahl)/log(2) für den 2er Logarithmus. Wenn jemand einen Beweis will, suche ich ihn.

Und zum Schluß:
*Glückwunsch Thomas, sehr elegante Lösung!*


----------



## Thomas Darimont (24. Oktober 2004)

Danke für die Blumen ;-)

Gruß Tom


----------

