# String in Integer umwandeln



## Agent (18. Apr 2009)

Hi,

ich habe einen String gegeben und möchte ein Zeichen aus diesem String (Ganzzahl) in inen Integer speichern.

```
int zahl = Integer.parseInt(String.valueOf(mystring.charAt(4)));
```
Dieser Code soll die fünfte Stelle vom String _mystring_ in die Integer-Variable _zahl_ ablegen.

Beim Compilieren gibts keine Fehler, aber beim Ausführen kommt folgende Meldung:


> Exception in thread "main" java.lang.NumberFormatException: For input string: ""
> at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
> at java.lang.Integer.parseInt(Integer.java:470)
> at java.lang.Integer.parseInt(Integer.java:514)
> ...


Wäre super, wenn mir jemand weiterhelfen kann!


----------



## 0x7F800000 (18. Apr 2009)

Laut API ist sowas gar nicht möglich:
String (Java Platform SE 6)


> valueOf
> 
> public static String valueOf(char c)
> 
> ...


entweder hast du hier irgendwas gepostet, was im code so gar nicht vorhanden ist, oder du hast einen schwerwigenden bug entdeckt. Mich würde mal der code drumherum interessieren.


----------



## Agent (18. Apr 2009)

0x7F800000 hat gesagt.:


> Laut API ist sowas gar nicht möglich:


Hallo???
Es *muss* möglich sein, ein Zeichen aus einem String in einen Integer zu speichern 

Der Code darüber sieht ungefähr so aus (inzwischen möglicherweise nicht mehr ganz so...)

```
public static int[][] readIn(String filename){
        File file = new File(filename);
        StringBuffer contents = new StringBuffer();
        BufferedReader reader = null;
 
        try
        {
            reader = new BufferedReader(new FileReader(file));
            String text = null;
 
            // repeat until all lines is read
            while ((text = reader.readLine()) != null)
            {
                contents.append(text)
                    .append(System.getProperty(
                        "line.separator"));
            }
        } catch (FileNotFoundException e)
        {
            e.printStackTrace();
        } catch (IOException e)
        {
            e.printStackTrace();
        } finally
        {
            try
            {
                if (reader != null)
                {
                    reader.close();
                }
            } catch (IOException e)
            {
                e.printStackTrace();
            }
        }
        
        //System.out.println(contents.toString());

	String content=contents.toString();
	String h;
	int k=0;
	int[][] board;
	board = new int[3][3];
```


----------



## andre111 (18. Apr 2009)

```
int zahl = mystring.charAt(4);
```
Das funktioniert, falls mystring länger als 4 Zeichen ist.


----------



## Ark (18. Apr 2009)

Warum finde ich in dem Codestück kein valueOf()? ???:L

@andre111: Das ist wohl korrekt, aber nicht das Problem, denn dann wäre es eine StringIndexOutOfBoundsException.

Ark


----------



## 0x7F800000 (18. Apr 2009)

Agent hat gesagt.:


> Hallo???
> Es *muss* möglich sein, ein Zeichen aus einem String in einen Integer zu speichern


Hast du meinen Beitrag gelesen? "unmöglich" bezog sich nicht auf String->Integer Umwandlung, sondern auf den fehler, der da angeblich auftreten soll... String.valueOf(char) kann unmöglich "" zurückliefern, das meinte ich mit "unmöglich".

Was dieser Codeausschnitt soll verstehe ich grad gar nicht, da kommt doch nirgends Integer.parseInt vor?! ???:L


----------



## Agent (18. Apr 2009)

andre111 hat gesagt.:


> ```
> int zahl = mystring.charAt(4);
> ```
> Das funktioniert, falls mystring länger als 4 Zeichen ist.


So wie ich das sehe, wird dem Integer _zahl_ damit einfach der ASCII-Code vom fünften Zeichen im String zugewiesen!?!


----------



## 0x7F800000 (18. Apr 2009)

Agent hat gesagt.:


> So wie ich das sehe, wird dem Integer _zahl_ damit einfach der ASCII-Code vom fünften Zeichen im String zugewiesen!?!


äääh, ASCII-Code ist das nicht, aber irgendetwas kryptisches. Wenn du jedenfalls

```
int x='1';
```
hinschreibst, wird in x definitiv nicht der integer-wert 1 gespeichert, sondern irgendeine Zahl, so zwischen 0 und 200 schätz ich mal... Mit deiner eigentlichen Frage scheint es aber nichts zu tun oder? Erzähl mal lieber, was du mit dem code ausschnitt da oben gemeint hast


----------



## Agent (18. Apr 2009)

Aaalso. Hier das leicht abgeänderte Code-Schnipsel. Die Funktion soll ein 3x3-Spielfeld aus einer Textdatei einlesen und dieses im Array _board_ ablegen.


```
public static int[][] readIn(String filename){
        File file = new File(filename);
        StringBuffer contents = new StringBuffer();
        BufferedReader reader = null;
 
        try
        {
            reader = new BufferedReader(new FileReader(file));
            String text = null;
 
            // repeat until all lines is read
            while ((text = reader.readLine()) != null)
            {
                contents.append(text)
                    .append(System.getProperty(
                        "line.separator"));
            }
        } catch (FileNotFoundException e)
        {
            e.printStackTrace();
        } catch (IOException e)
        {
            e.printStackTrace();
        } finally
        {
            try
            {
                if (reader != null)
                {
                    reader.close();
                }
            } catch (IOException e)
            {
                e.printStackTrace();
            }
        }

	String content=contents.toString();
	String h;
	int k=0;
	int[][] board;
	board = new int[3][3];

	if (content.length() <= 20){
	  for (int j=0; j<3; j++) {
	    for (int i=0; i<3; i++) {
	      if (j==0) k=2*i;   //hier wird an die richtige Stelle im String navigiert
	      else if (j==1) k=2*i+7;
	      else if (j==2) k=2*i+14;
	      board[i][j]=content.charAt(k);
	    }
	  }
	}
	return board;
  }
```

Die zuvor beschriebene Exception ist nicht mehr vorhanden. Das ausgegebene Feld _board_ enthält aber falsche Werte.

Die Textdatei enthält:


> 1 2 3
> 4 0 5
> 7 8 6



Das Array _board_ enthält:


> 49 50 51
> 32 32 10
> 56 54 10


----------



## Der Müde Joe (18. Apr 2009)

>String.valueOf(char) kann unmöglich "" zurückliefern, das meinte ich mit "unmöglich".

doch: 


```
Integer.parseInt(String.valueOf((char)173));
```

;-)


----------



## andre111 (18. Apr 2009)

Upps, jetzt versteh ich glaub, wenn der char '1' ist, dann soll der Wert der Integervariable auch 1 sein.
Dann ist mein Codebeispiel natürlich falsch, sry.


----------



## Agent (18. Apr 2009)

@Der Müde Joe: Was bringt mir das jetzt? Hast du hier schon mal was geschrieben?


----------



## Agent (18. Apr 2009)

andre111 hat gesagt.:


> Upps, jetzt versteh ich glaub, wenn der char '1' ist, dann soll der Wert der Integervariable auch 1 sein.


genau genau genau


----------



## Der Müde Joe (18. Apr 2009)

>Was bringt mir das jetzt? Hast du hier schon mal was geschrieben? 

Naja....hätte die Lösung jetzt..aber dann halt

Schau in die Ascii Tabelle und schau dir an welches Zeichen an der stelle 49 ist...
Alernativ:

```
System.out.println((char)49);
```


----------



## 0x7F800000 (18. Apr 2009)

Agent hat gesagt.:


> @Der Müde Joe: Was bringt mir das jetzt?


Allgemeinbildung, und vielleicht findest du das auch gewissermaßen lustig^^


> Hast du hier schon mal was geschrieben?


joah, so einiges, das erkennt man am status "Megabyte" 


Agent hat gesagt.:


> genau genau genau


du musst es nur klein wenig verändern:

```
content.charAt(k)-'0';
```
sollte den "echten" integer wert liefern, der der Ziffer entspricht. Das liegt daran, dass chars '0','1','2'... alle nacheinander folgen, und im prinzip nur komische symbole für stinknormale zahlen sind, also so in etwa:
'0'=789,'1'=790,'2'=791 usw
(die "wahren" werte sind frei erfunden, kA wo das anfängt)

@Der Müde Joe: was hast du dir da tolles rausgesucht? irgendein "beep"-char, oder irgendein "verschluck den letzten char"-char oder irgendsowas hackiges?  Das wollte ich dem OP absichtlich ersparen  Aber die API ist dennoch ungenau^^:autsch:


----------



## Der Müde Joe (18. Apr 2009)

>was hast du dir da tolles rausgesucht?

Frag besser nicht:

```
for (int i = 0; i < 256; i++) {
	try {
		System.err.println(i + " " + (char) i);
		Integer.parseInt(String.valueOf((char) i));
	} catch (Exception e) {
		e.printStackTrace();
	}
}
```


----------



## andre111 (18. Apr 2009)

```
'0' == 48
'1' == 49
...
'9' == 57
```


----------



## Ebenius (20. Apr 2009)

Wieso nicht einfach? Entweder: 
	
	
	
	





```
Character.digit(mystring.charAt(4), 10);
```
oder: 
	
	
	
	





```
Integer.parseInt(myString.substr(4, 5));
```
Ebenius


----------

