HOWTO · Java

Wie erhält man die einzelnen Ziffern einer Int-Nummer in Java

Der Beitrag zeigt vier Ansätze, um die Ziffern einer Ganzzahl zu trennen: mit `%` und `/`, `toCharArray()`, `String.split` und Rekursion.

Auf dieser Seite

Um die Ziffern eines positiven int in ihrer ursprünglichen Reihenfolge auszugeben, können Sie sie mit % und / herauslösen oder die Zahl in eine Zeichenfolge umwandeln und deren Zeichen untersuchen. Dieser Beitrag zeigt diese Ansätze sowie eine rekursive Alternative und verwendet durchgehend 12223.

Mit % (mod) den Rest einer Ganzzahl ermitteln

Bei einer positiven Zahl liefert % 10 die letzte Ziffer; / 10 entfernt diese Ziffer. Die Ziffern werden also von rechts nach links herausgelöst. Speichern Sie jeden Rest in einem LinkedList-Stack und entnehmen Sie anschließend die Werte, um sie in der ursprünglichen Reihenfolge auszugeben. Dieses Beispiel gilt für positive int-Werte; Null und negative Eingaben müssen gesondert behandelt werden.

Die Schleife endet, sobald der verbleibende Wert null ist. Bei der Eingabe null bliebe die Liste deshalb leer und es würden keine Ziffern ausgegeben. Wenn null eine gültige Eingabe ist, ergänzen Sie einen Sonderfall, der 0 ausgibt. Bei negativen Werten kann auch der Java-Rest negativ sein, daher ist diese Schleife keine allgemeine Lösung für vorzeichenbehaftete Zahlen. Sie könnten zunächst das Vorzeichen speichern und mit dem Betrag weiterarbeiten. Dabei ist Integer.MIN_VALUE zu beachten, dessen positiver Betrag nicht als int dargestellt werden kann. Wenn ein int diesen Wert annehmen kann, verwenden Sie einen Betrag vom Typ long oder wählen Sie stattdessen einen Ansatz mit Zeichenfolgen. Das arithmetische Verfahren ist nützlich, wenn Sie direkt mit den numerischen Ziffern arbeiten möchten, etwa um sie zu summieren.

Führen Sie dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import java.util.LinkedList;

public class Main {
  public static void main(String[] args) {
    int number = 12223;
    LinkedList<Integer> digits = new LinkedList<>();

    while (number > 0) {
      digits.push(number % 10);
      number /= 10;
    }
    while (digits.size() > 0) {
      System.out.println(digits.pop());
    }
  }
}
1
2
2
2
3

Mit String.toCharArray() ein Zeichenarray erhalten

Wandeln Sie die Ganzzahl in eine Zeichenfolge um und rufen Sie anschließend toCharArray() auf, um für jede Ziffer ein Zeichen zu erhalten. Ein char wie '2' ist ein Zeichen und nicht der Zahlenwert 2; verwenden Sie Character.digit, wenn Sie für eine Berechnung eine ganzzahlige Ziffer benötigen. Diese Variante ist auf positive Eingaben beschränkt, sodass das resultierende Array nur Ziffern enthält.

Der Ansatz behält die angezeigte Reihenfolge der Ziffern bei und lässt sich leicht für Prüfungen oder Formatierungen anpassen. Für numerische Berechnungen wandelt Character.digit(digit, 10) jedes dezimale Ziffernzeichen in seinen ganzzahligen Wert um. Falls die Quelle auch andere Zeichen enthalten kann, prüfen Sie, ob der Rückgabewert negativ ist. Die Zeichenfolge einer negativen Ganzzahl beginnt mit '-'; überspringen oder behandeln Sie dieses Vorzeichen gesondert, statt es als Ziffer zu verwenden. Null wird in die einstellige Zeichenfolge "0" umgewandelt, sodass dieser Ansatz ihre Ziffer beibehält. Da der Wertebereich von int begrenzt ist, wird die vollständige Dezimaldarstellung dieses Werts umgewandelt. Ziffern eines größeren Zahlentyps oder führende Nullen aus einer ursprünglichen Eingabezeichenfolge sind darin nicht enthalten.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

public class Main {
  public static void main(String[] args) {
    int number = 12223;
    char[] digits = String.valueOf(number).toCharArray();

    for (char digit : digits) {
      System.out.println(Character.digit(digit, 10));
    }
  }
}
1
2
2
2
3

Mit number.split("(?<=.)") ein String-Array erzeugen und die Zeichenfolge aufteilen

String.split gibt ein Array aus Zeichenfolgen zurück. Der reguläre Ausdruck (?<=.) findet eine Position direkt nach einem Zeichen. Dadurch wird die Zeichenfolge einer positiven Ganzzahl in ein Element pro Ziffer aufgeteilt. Bei einer Zahl mit Minuszeichen wird auch das Vorzeichen zu einem Element. Wenn Sie Zeichen statt Zeichenfolgen benötigen, ist toCharArray() meist einfacher.

Jedes Arrayelement bleibt Text. Wandeln Sie ein Element daher nur dann in eine Zahl um, wenn spätere Berechnungen einen ganzzahligen Wert erfordern. Bei der Umwandlung in eine Zeichenfolge ergibt null "0"; eine negative Zahl ergibt ein vorangestelltes Vorzeichen und anschließend ihre Ziffern. Filtern Sie das Vorzeichen heraus, bevor Sie die Ziffern umwandeln. Dieser Ausdruck ist praktisch, wenn der restliche Verarbeitungsschritt ohnehin Zeichenfolgen erwartet. Für eine einfache Zeichenverarbeitung verursacht er jedoch zusätzlichen Aufwand durch reguläre Ausdrücke und ein Array, ohne gegenüber toCharArray() einen Vorteil zu bieten. Wie beim anderen Ansatz über eine Zeichenfolge wird die Darstellung des Zahlenwerts verarbeitet: Führende Nullen, die im ursprünglichen int nicht enthalten waren, lassen sich damit nicht wiederherstellen.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

public class Main {
  public static void main(String[] args) {
    int number1 = 12223;
    String number = String.valueOf(number1);
    String[] digits = number.split("(?<=.)");

    for (String digit : digits) {
      System.out.println(digit);
    }
  }
}
1
2
2
2
3

Ziffern einer Ganzzahl mithilfe von Rekursion trennen

Teilen Sie eine positive Zahl rekursiv durch 10, bis sie null erreicht. Geben Sie jeden Rest nach der Rückkehr aus dem rekursiven Aufruf aus; so erscheint die linke Ziffer zuerst. Diese Variante gibt für null nichts aus und verarbeitet keine negativen Eingaben. Falls solche Werte in Ihrer Anwendung gültig sind, ergänzen Sie eine ausdrückliche Behandlung.

Die Abbruchbedingung ist der Basisfall: Sobald die Division null ergibt, kehren die Aufrufe zurück, ohne etwas auszugeben. Beim Zurücklaufen geben die wartenden Aufrufe ihre gespeicherten Reste aus. Der Aufrufstapel kehrt so die Reihenfolge der herausgelösten Ziffern um, ohne dass eine zusätzliche Sammlung nötig ist. Für die Eingabe null fügen Sie eine direkte Ausgabe hinzu, da die Bedingung der Methode bereits beim ersten Aufruf falsch ist. Bei negativen Eingaben behandeln und drucken Sie zuerst das Vorzeichen und rufen die Rekursion anschließend mit einem sicheren Betrag auf. Berücksichtigen Sie auch Integer.MIN_VALUE, wenn jeder mögliche int zulässig ist. Rekursion eignet sich besonders als Lehrbeispiel für eine kurze Ganzzahl; eine iterative Schleife lässt sich meist einfacher erweitern und benötigt keinen Stack-Frame pro Ziffer.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

public class Main {
  public static void main(String[] args) {
    recursion(12223);
  }

  public static void recursion(int number) {
    if (number > 0) {
      recursion(number / 10);
      System.out.println(number % 10);
    }
  }
}
1
2
2
2
3