Как получить отдельные цифры целого числа? - PullRequest
115 голосов
/ 02 августа 2010

У меня есть номера, такие как 1100, 1002, 1022 и т. Д. Я хотел бы иметь отдельные цифры, например, для первого номера 1100, я хочу иметь 1, 1, 0, 0.

Как можноЯ получаю это на Java?

Ответы [ 24 ]

171 голосов
/ 02 августа 2010

Для этого вы будете использовать оператор % (mod).

int number; // = some int

while (number > 0) {
    print( number % 10);
    number = number / 10;
}

Оператор мода даст вам остаток от деления int на число.

Итак,

10012 % 10 = 2

Потому что:

10012 / 10 = 1001, remainder 2

Примечание: Как отметил Павел, это даст вам числа в обратном порядке.Вам нужно будет поместить их в стек и вытолкнуть их в обратном порядке.

Код для печати чисел в правильном порядке:

int number; // = and int
LinkedList<Integer> stack = new LinkedList<Integer>();
while (number > 0) {
    stack.push( number % 10 );
    number = number / 10;
}

while (!stack.isEmpty()) {
    print(stack.pop());
}
68 голосов
/ 02 августа 2010

Преобразуйте его в String и используйте String#toCharArray() или String#split().

String number = String.valueOf(someInt);

char[] digits1 = number.toCharArray();
// or:
String[] digits2 = number.split("(?<=.)");

Если вы уже работаете с Java 8 и вам захочется впоследствии выполнить с ним несколько агрегатных операций, рассмотрите возможность использования String#chars(), чтобы получить IntStream из об этом.

IntStream chars = number.chars();
25 голосов
/ 02 августа 2010

Как насчет этого?

public static void printDigits(int num) {
    if(num / 10 > 0) {
        printDigits(num / 10);
    }
    System.out.printf("%d ", num % 10);
}

или вместо печати на консоль мы можем собрать его в массив целых чисел, а затем распечатать массив:

public static void main(String[] args) {
    Integer[] digits = getDigits(12345);
    System.out.println(Arrays.toString(digits));
}

public static Integer[] getDigits(int num) {
    List<Integer> digits = new ArrayList<Integer>();
    collectDigits(num, digits);
    return digits.toArray(new Integer[]{});
}

private static void collectDigits(int num, List<Integer> digits) {
    if(num / 10 > 0) {
        collectDigits(num / 10, digits);
    }
    digits.add(num % 10);
}

Если выХотелось бы сохранить порядок цифр от наименее значимого (индекс [0]) до старшего (индекс [n]), вам нужно следующее обновленное getDigits ():

/**
 * split an integer into its individual digits
 * NOTE: digits order is maintained - i.e. Least significant digit is at index[0]
 * @param num positive integer
 * @return array of digits
 */
public static Integer[] getDigits(int num) {
    if (num < 0) { return new Integer[0]; }
    List<Integer> digits = new ArrayList<Integer>();
    collectDigits(num, digits);
    Collections.reverse(digits);
    return digits.toArray(new Integer[]{});
}
20 голосов
/ 09 апреля 2013

Я не видел, чтобы кто-нибудь использовал этот метод, но он работал для меня и был коротким и приятным:

int num = 5542;
String number = String.valueOf(num);
for(int i = 0; i < number.length(); i++) {
    int j = Character.digit(number.charAt(i), 10);
    System.out.println("digit: " + j);
}

Будет выведено:

digit: 5
digit: 5
digit: 4
digit: 2
7 голосов
/ 05 февраля 2018

Я заметил, что есть несколько примеров использования потока Java 8 для решения вашей проблемы, но я думаю, что это самый простой:

int[] intTab = String.valueOf(number).chars().map(Character::getNumericValue).toArray();

Для ясности: вы используете String.valueOf(number) для преобразованияв String, затем метод chars() для получения IntStream (каждый символ из вашей строки теперь является числом Ascii), затем вам нужно запустить метод map(), чтобы получить числовые значения числа Ascii.В конце вы используете метод toArray(), чтобы преобразовать ваш поток в массив int [].

5 голосов
/ 07 октября 2012
// could be any num this is a randomly generated one
int num = (int) (Math.random() * 1000);

// this will return each number to a int variable
int num1 = num % 10;
int num2 = num / 10 % 10;
int num3 = num /100 % 10;

// you could continue this pattern for 4,5,6 digit numbers
// dont need to print you could then use the new int values man other ways
System.out.print(num1);
System.out.print("\n" + num2);
System.out.print("\n" + num3);
5 голосов
/ 21 августа 2018

Я вижу, что все ответы уродливы и не очень чисты.

Я предлагаю вам использовать рекурсию для решения вашей проблемы. Этот пост очень старый, но может пригодиться будущим кодировщикам.

public static void recursion(int number) {
    if(number > 0) {
        recursion(number/10);
        System.out.printf("%d   ", (number%10));
    }
}

Выход:

Input: 12345

Output: 1   2   3   4   5 
3 голосов
/ 11 ноября 2014

Более простой способ - преобразовать число в строку и использовать substring для извлечения, а затем преобразовать в целое число.

Примерно так:

int digits1 =Integer.parseInt( String.valueOf(201432014).substring(0,4));
    System.out.println("digits are: "+digits1);

output is 2014

2 голосов
/ 05 декабря 2016

Вот мой ответ, я сделал это для себя, и я надеюсь, что он достаточно прост для тех, кто не хочет использовать строковый подход или нуждается в более математическом решении:

public static void reverseNumber2(int number) {

    int residual=0;
    residual=number%10;
    System.out.println(residual);

    while (residual!=number)  {
          number=(number-residual)/10;
          residual=number%10;
          System.out.println(residual);
    }
}

ИтакЯ просто получаю единицы, распечатываю их, вычитаю их из числа, затем делю это число на 10 - что всегда без каких-либо плавающих вещей, так как единицы исчезли, повторите.

2 голосов
/ 13 октября 2013

Я написал программу, которая демонстрирует, как разделять цифры целого числа, используя более простой и понятный подход, который не включает в себя массивы, рекурсии и все такое причудливое бесчестье. Вот мой код:

int year = sc.nextInt(), temp = year, count = 0;

while (temp>0)
{
  count++;
  temp = temp / 10;
}

double num = Math.pow(10, count-1);
int i = (int)num;

for (;i>0;i/=10)
{
  System.out.println(year/i%10);
}

Предположим, что вы вводите целое число 123, в результате вы получите следующий результат:

1
2
3
...