4.3 Konvertieren zwischen Primitiven und Strings 

Bevor ein Datentyp auf dem Bildschirm ausgegeben, zum Drucker geschickt oder in einer ASCII-Datei gespeichert werden kann, muss das Java-Programm ihn in einen String konvertieren. Wenn wir etwa die Zahl 7 ohne Umwandlung ausgäben, hätten wir keine 7 auf dem Bildschirm, sondern einen Pieps aus dem Lautsprecher – je nach Implementierung. Auch umgekehrt ist eine Konvertierung wichtig: Gibt der Benutzer in einem Dialog sein Alter an, ist das zuerst immer ein String. Diesen muss die Anwendung in einem zweiten Schritt in eine Ganzzahl konvertieren, um etwa eine Altersabfrage zu realisieren.
4.3.1 Unterschiedliche Typen in String-Repräsentationen konvertieren 

Die statischen überladenen Funktionen String.valueOf() liefern die String-Repräsentation eines primitiven Werts oder eines Objekts.
Beispiel Konvertierungen einiger Datentypen in Strings: String s1 = String.valueOf( 10 ); // 10 String s2 = String.valueOf( Math.PI ); // 3.141592653589793 String s3 = String.valueOf( 1 < 2 ); // true String s4 = String.valueOf( new Date() ); // Mon Feb 06 14:40:38 CEST 2006 |
Sehen wir uns abschließend die Implementierungen von valueOf(Object) an:
public static String valueOf( Object obj ) { return (obj == null) ? "null" : obj.toString(); }
Die String-Umsetzung wird an das Objekt delegiert, denn jedes Objekt besitzt eine toString()-Methode. Die Sonderbehandlung testet, ob null übergeben wurde, und liefert dann einen gültigen String mit dem Inhalt »null«. Auch liefert eine Ausgabe wie System.out.println(null) den String »null«, genauso ergibt System.out.println(null + "0") die Ausgabe »null0«, wenn null als Glied in der Additionskette steht.
Unterschiedliche Ausgabeformate (Binär, Hex, Oktal)
Neben der Funktion String.valueOf(number), die eine Zahl als String-Repräsentation im vertrauten Dezimalsystem ausgibt, gibt es vier weitere Varianten für die binäre, hexadezimale und oktale Darstellung sowie für die Darstellung einer beliebigen Basis. Die Funktionen sind allerdings nicht als statische Methoden bei String, sondern als statische Funktionen der Klassen Integer und Long festgemacht.
final class Long | Integer extends Number implements Comparable<Long> | Comparable<Integer>, Serializable |
- static String toBinaryString( int | long i )
- static String toOctalString( int | long i )
- static String toHexString( int | long i )
Erzeugt eine Binärrepräsentation (Basis 2)/Oktalzahlrepräsentation (Basis 8)/Hexadezimalrepräsentation (Basis 16) der vorzeichenlosen Zahl.
- static String toString( int | long i, int radix )
Erzeugt eine String-Repräsentation der Zahl zur angegebenen Basis.
Wir dürfen nicht vergessen, dass das Format der Übergabe int beziehungsweise long ist und nicht byte. Dies führt zu Ausgaben, die einkalkuliert werden müssen. Genauso werden führende Nullen grundsätzlich nicht mit ausgegeben.
Listing 4.7 ToHex.java, main()
System.out.println( "15=" + Integer.toHexString(15) ); // 15=f System.out.println( "16=" + Integer.toHexString(16) ); // 16=10 System.out.println( "127=" + Integer.toHexString(127) ); // 127=7f System.out.println( "128=" + Integer.toHexString(128) ); // 128=80 System.out.println( "255=" + Integer.toHexString(255) ); // 255=ff System.out.println( "256=" + Integer.toHexString(256) ); // 256=100 System.out.println( "-1=" + Integer.toHexString(-1) ); // –1=ffffffff
4.3.2 String in primitives Element konvertieren 

Zum Parsen eines Strings – zum Beispiel in eine Ganzzahl – ist nicht die Klasse String verantwortlich, sondern spezielle Klassen, die für jeden primitiven Datentyp vorhanden sind. Die Klassen deklarieren statische parseXXX()-Funktionen, wie die folgende Tabelle zeigt:
Klasse | Konvertierungsfunktion |
java.lang.Boolean |
parseBoolean( String s ) |
java.lang.Byte |
parseByte( String s ) |
java.lang.Short |
parseShort( String s ) |
java.lang.Integer |
parseInt( String s ) |
java.lang.Long |
parseLong( String s ) |
java.lang.Double |
parseDouble( String s ) |
java.lang.Float |
parseFloat( String s ) |
Kann eine Funktion eine Konvertierung nicht durchführen, weil sich der String nicht konvertieren lässt, löst sie eine NumberFormatException aus. Das ist zum Beispiel der Fall, wenn parseDouble() als Dezimaltrenner ein Komma statt eines Punktes empfängt. Bei der Funktion parseBoolean() ist die Groß-/Kleinschreibung irrelevant.
Eine spezialisierte Methode für eine gegebene Basis ist Integer.parseInt(String s, int radix). Diese ist gut für Hexadezimalzahlen mit der Basis 16. Dazu einige Anwendungsfälle:
Konvertieraufruf | Ergebnis |
parseInt("0", 10) |
0 |
parseInt("473", 10) |
473 |
parseInt("-0", 10) |
0 |
parseInt("-FF", 16) |
–255 |
parseInt("1100110", 2) |
102 |
parseInt("2147483647", 10) |
2147483647 |
parseInt("-2147483648", 10) |
–2147483648 |
parseInt("2147483648", 10) |
throws NumberFormatException |
parseInt("99", 8) |
throws NumberFormatException |
parseInt("Papa", 10) |
throws NumberFormatException |
parseInt("Papa", 27) |
500050 |
parseXXX() und Leerzeichen
Die Konvertierungsfunktion parseInt() schneidet keine Leerzeichen ab und würde einen Parserfehler melden, wenn der String etwa mit einem Leerzeichen endet. (Die Helden der Java-Bibliothek haben allerdings bei Float.parseFloat() und Double.parseDouble() anders gedacht: Hier wird die Zeichenkette vorher schlank getrimmt.)
Beispiel Leerzeichen zur Konvertierung einer Ganzzahl abschneiden: String s = " 1234 ".trim(); // s = "1234"
int i = Integer.parseInt( s ); // i = 1234 |
Das, was bei einem String.valueOf() als Ergebnis erscheint – und das ist auch das, worauf zum Beispiel System.out.print() basiert –, kann parseXXX() wieder in den gleichen Wert zurückverwandeln.
Hinweis Eine Funktion Character.parseCharacter(String) fehlt. Eine vergleichbare Realisierung ist, auf das erste Zeichen eines Strings zuzugreifen, etwa so: char c = string.charAt(0). |