HOWTO · Java
Cómo obtener los dígitos separados de un número Int en Java
Esta guía muestra varios enfoques para separar los dígitos de un número entero, con ejemplos.
En esta página
Para imprimir los dígitos de un int positivo en su orden original, puedes extraerlos con % y /, o convertir el número en una cadena y examinar sus caracteres. Esta guía muestra esos enfoques y una alternativa recursiva, usando 12223 en todo momento.
Usar % (mod) para obtener el resto de un número entero
Para un número positivo, % 10 devuelve su dígito más a la derecha y / 10 elimina ese dígito. Por eso, la extracción va de derecha a izquierda. Guarda cada resto en una pila LinkedList y luego extrae los valores para imprimirlos en el orden original. Este ejemplo admite valores int positivos; el cero y los números negativos requieren un tratamiento aparte.
El bucle termina cuando el valor restante llega a cero. Por eso, si la entrada es cero, la lista queda vacía y no se imprime ningún dígito. Si el cero es una entrada válida, añade un caso especial que imprima 0. En Java, el resto de un número negativo también puede ser negativo, así que este bucle no sirve como solución general para números con signo. Podrías guardar primero el signo y procesar el valor absoluto, teniendo en cuenta que la magnitud positiva de Integer.MIN_VALUE no se puede representar como int. Si el int puede incluir ese valor, usa una magnitud de tipo long o elige un enfoque basado en cadenas. Este método aritmético resulta útil cuando necesitas directamente los valores numéricos de los dígitos, por ejemplo, para sumarlos.
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
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
Usar String.toCharArray() para obtener un arreglo de caracteres
Convierte el entero en una cadena y luego llama a toCharArray() para obtener un carácter por cada dígito. Un char como '2' es un carácter, no el valor numérico 2; usa Character.digit cuando el cálculo requiera un dígito entero. Esta versión se limita a entradas positivas, por lo que el arreglo resultante contiene solo dígitos.
Este enfoque conserva el orden de los dígitos tal como aparecen en la entrada y se adapta fácilmente a tareas de validación o formato. Para hacer cálculos, Character.digit(digit, 10) convierte cada carácter de dígito decimal en su valor entero; si el origen puede contener caracteres que no sean dígitos, comprueba si devuelve un valor negativo. Al convertir un entero negativo en una cadena, '-' aparece como primer carácter: omite o trata ese signo por separado en lugar de considerarlo un dígito. El cero se convierte en la cadena de un solo carácter "0", así que este enfoque conserva su dígito de forma natural. Como int tiene un rango limitado, se convierte la representación decimal completa de ese valor, no los dígitos de un tipo numérico mayor ni los de una cadena de entrada con ceros iniciales.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
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
Usar number.split("(?<=.)") para obtener y separar un arreglo de cadenas
String.split devuelve un arreglo de cadenas. La expresión regular (?<=.) coincide con una posición inmediatamente posterior a un carácter, de modo que la cadena del entero positivo se divide en una cadena por cada dígito. Si el número tiene signo menos, el signo también queda como elemento; si necesitas caracteres en lugar de cadenas, toCharArray() suele ser más sencillo.
Cada elemento del arreglo sigue siendo texto, así que convierte un elemento en entero solo cuando los cálculos posteriores lo requieran. La conversión a cadena también hace que el valor cero produzca "0", mientras que un valor negativo produce primero un elemento con el signo y luego los dígitos; filtra el signo antes de convertir los dígitos. Esta expresión es práctica cuando el resto de la tarea ya requiere cadenas, pero añade el costo de la expresión regular y del arreglo sin ofrecer ventajas frente a toCharArray() para recorrer caracteres. Al igual que el otro enfoque que convierte el entero en una cadena, muestra la representación del valor numérico: no puede recuperar los ceros iniciales que no estaban en el int original.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
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
Separar los dígitos de un int mediante recursión
Divide recursivamente un número positivo entre 10 hasta que llegue a cero. Imprime cada resto cuando retorna la llamada recursiva; ese orden imprime primero el dígito de más a la izquierda. Esta versión no imprime nada para el cero y no procesa entradas negativas, así que añade un tratamiento explícito si esos valores son válidos en tu aplicación.
La condición de parada es el caso base: cuando la división llega a cero, las llamadas retornan sin imprimir, y las llamadas pendientes imprimen sus restos guardados mientras se deshace la recursión. La pila de llamadas invierte el orden de extracción sin necesidad de una colección aparte. Para la entrada cero, añade una impresión directa, porque la condición del método es falsa desde la primera llamada. Para una entrada negativa, trata e imprime el signo antes de recursar sobre una magnitud segura; contempla también Integer.MIN_VALUE si se admite cualquier valor int. La recursión es más clara como ejemplo didáctico con un entero corto, mientras que un bucle iterativo suele ser más fácil de ampliar y no usa un marco de pila por cada dígito.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
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