HOWTO · Java
Como obter os dígitos separados de um número Int em Java
Apresenta abordagens para separar os dígitos de um número inteiro, com exemplos.
Nesta página
Para imprimir os dígitos de um int positivo na ordem original, você pode extraí-los com % e / ou converter o número em uma string e examinar seus caracteres. Este guia apresenta essas abordagens e uma alternativa recursiva, usando 12223 em todo o artigo.
% (mod) para obter o resto do número inteiro informado
Para um número positivo, % 10 fornece o último dígito à direita, e / 10 remove esse dígito. Portanto, a extração ocorre da direita para a esquerda. Armazene cada resto em uma pilha LinkedList e, em seguida, remova os valores para imprimi-los na ordem original. Este exemplo se aplica a valores int positivos; entradas zero e negativas exigem tratamento separado.
O loop para assim que o valor restante chega a zero. Por isso, para a entrada zero, a lista ficaria vazia e nenhum dígito seria impresso. Se zero for uma entrada válida, inclua um caso especial que imprima 0. O resto de um valor negativo em Java também pode ser negativo, portanto este loop não é uma solução geral para números com sinal. Você pode registrar o sinal primeiro e processar o valor absoluto, mas é preciso ter cuidado com Integer.MIN_VALUE, cujo valor absoluto positivo não pode ser representado como int. Se um int puder incluir esse valor, use um valor absoluto do tipo long ou escolha uma abordagem baseada em string. Este método aritmético é útil quando você precisa diretamente dos valores numéricos dos dígitos, por exemplo, para somá-los.
Execute este exemplo:
O código e os rótulos ou saídas exibidos nesta seção permanecem em 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
String.toCharArray() para obter o array de caracteres
Converta o inteiro em uma string e chame toCharArray() para obter um caractere para cada dígito. Um char como '2' é um caractere, não o valor numérico 2; use Character.digit quando o cálculo exigir o valor inteiro do dígito. Esta versão se limita a entradas positivas, portanto o array resultante contém apenas dígitos.
Essa abordagem mantém a ordem dos dígitos exibidos na entrada e é fácil de adaptar para validação ou formatação. Para cálculos numéricos, Character.digit(digit, 10) converte cada caractere de dígito decimal em seu valor inteiro; verifique se o resultado é negativo caso a origem possa conter caracteres que não sejam dígitos. Ao converter um inteiro negativo em string, '-' aparece como primeiro caractere. Ignore esse sinal ou trate-o separadamente, em vez de considerá-lo um dígito. O zero é convertido na string de um caractere "0", então essa abordagem mantém naturalmente seu dígito. Como int tem um intervalo limitado, essa conversão obtém a representação decimal completa desse valor, mas não os dígitos de um tipo numérico maior nem os zeros à esquerda de uma string de entrada.
O código e os rótulos ou saídas exibidos nesta seção permanecem em 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
Método number.split("(?<=.)") para obter um array de strings e separar seus elementos
String.split retorna um array de strings. A expressão regular (?<=.) corresponde a uma posição imediatamente depois de um caractere, então a string de um inteiro positivo é dividida em uma string por dígito. Para um número com sinal de menos, o sinal também será um elemento; toCharArray() costuma ser mais simples quando você quer caracteres em vez de strings.
Cada elemento do array continua sendo texto, então só o converta quando um cálculo posterior exigir um valor inteiro. A conversão para string também significa que o valor zero resulta em "0", enquanto um valor negativo resulta em um elemento inicial com o sinal, seguido pelos dígitos; filtre o sinal antes de converter os dígitos. Essa expressão é útil quando o restante da tarefa já espera strings, mas adiciona o custo da expressão regular e do array sem oferecer vantagem sobre toCharArray() para percorrer caracteres. Assim como na outra abordagem que converte o inteiro em string, ela mostra a representação do valor numérico e não recupera zeros à esquerda que não estavam presentes no int original.
O código e os rótulos ou saídas exibidos nesta seção permanecem em 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 os dígitos de um int usando recursão
Divida recursivamente um número positivo por 10 até que ele chegue a zero. Imprima cada resto depois que a chamada recursiva retornar; assim, o dígito mais à esquerda é impresso primeiro. Esta versão não imprime nada para zero e não processa entradas negativas, então inclua um tratamento explícito se esses valores forem válidos na sua aplicação.
A condição de parada é o caso-base: quando a divisão chega a zero, as chamadas retornam sem imprimir, e as chamadas pendentes imprimem os restos armazenados enquanto a pilha de chamadas é desfeita. Essa pilha inverte a ordem da extração sem precisar de uma coleção separada. Para a entrada zero, imprima 0 diretamente, pois a condição do método é falsa já na primeira chamada. Para uma entrada negativa, trate e imprima o sinal antes de recursar sobre um valor absoluto seguro; considere também Integer.MIN_VALUE se qualquer valor de int puder ser usado. A recursão é mais clara como exemplo didático para um inteiro curto, enquanto um loop iterativo costuma ser mais fácil de ampliar e não usa um quadro da pilha para cada dígito.
O código e os rótulos ou saídas exibidos nesta seção permanecem em 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