Wenn Zeichen aus Benutzereingaben stammen stellt sich die Anforderung, diese in die Zahl zu konvertieren. Aus der Ziffer ‚5‘ soll das der numerische Wert 5 folgen. Nach alter Hacker-Tradition war die Lösung immer die, eine ‚0‘ abzuziehen. Die ASCII-Null ‚0‘ hat den char-Wert 48, ‚1‘ dann 49, bis ‚9‘ schließlich 57 erreicht. So ist logischerweise ‚5‘ – ‚0‘ = 53 – 48 = 5. Die Lösung hat einen Nachteil, dass sie nur für ASCII-Ziffern funktioniert.
Eine ordentliche Java-Lösung besteht zum Beispiel darin, ein char in ein String zu konvertieren und diesen über eine Integer-Methode zu konvertieren, etwa so:
char c = '5'; int i = Integer.parseInt( String.valueOf(c) ); // 5
Die parseInt(…)-Methode ist voll internationalisiert und konvertiert ebenso Dezimalzahlen aus anderen Schriftsystemen, etwa Hindi/Sanskrit:
System.out.println( Integer.parseInt( "५" ) ); // 5
Das funktioniert, ist jedoch für einzelne Zeichen nicht besonders effizient in Schleifen. Es gibt zwei andere Möglichkeiten, mit statischen Methoden aus der Klasse Character.
getNumericValue(…)-Methode
Die Character-Methode getNumericValue(char) liefert den numerischen Wert einer Ziffer zurück; natürlich arbeitet die Methode wieder internationalisiert:
int i = Character.getNumericValue( '5' ); System.out.println( i ); // 5 System.out.println( Integer.parseInt( "५" ) ); // 5
Die Methode ist viel leistungsfähiger, denn sie kennt den tatsächlichen „Wert“ aller Unicode-Zeichen. Zum Beispiel auch der römischen Ziffern Ⅰ, Ⅱ, Ⅲ, Ⅳ, Ⅴ, Ⅵ, Ⅶ, Ⅷ, Ⅸ, Ⅹ, Ⅺ, Ⅻ, Ⅼ, Ⅽ, Ⅾ, Ⅿ, …, die im Unicode-Alphabet ab ‚\u2160‘ stehen:
System.out.println( Character.getNumericValue( '\u216f' ) ); // 1000
XXXdigit(…)-Methoden
Die Character-Klasse besitzt ebenso eine Umwandlungsmethode für Ziffern bezüglich einer beliebigen Basis, das auch in die andere Richtung.
final class java.lang.Character
implements Serializable, Comparable<Character>
- staticintdigit(charch,intradix)
Liefert den numerischen Wert, den das Zeichen ch unter der Basis radix Beispielsweise ist Character.digit(‚f‘, 16) gleich 15. Erlaubt ist jedes Zahlensystem mit einer Basis zwischen Character.MIN_RADIX (2) und Character.MAX_RADIX (36). Ist keine Umwandlung möglich, beträgt der Rückgabewert –1. - staticcharforDigit(intdigit,intradix)
Konvertiert einen numerischen Wert in ein Zeichen. Beispielsweise ist forDigit(6, 8) gleich „6“ und Character.forDigit(12, 16) ist „c“.
Beispiel: Konvertiere eine Zeichenkette mit Ziffern in eine Ganzzahl.
char[] chars = { '3', '4', '0' }; int result = 0; for ( char c : chars ) { result = result * 10 + Character.digit( c, 10 ); System.out.println( result ); }
Die Ausgabe ist 3, 34 und 340.