web-dev-qa-db-fra.com

Vérifier la validité de la carte de crédit à l'aide de l'algorithme de Luhn

J'ai essayé de vérifier la validation de la carte de crédit en utilisant l'algorithme Luhn, qui fonctionne comme suit:

  1. Doublez tous les deux chiffres de droite à gauche. Si le doublement d'un chiffre donne un nombre à deux chiffres, additionnez les deux chiffres pour obtenir un nombre à un chiffre.

    2 * 2 = 4

    2 * 2 = 4

    4 * 2 = 8

    1 * 2 = 2

    6 * 2 = 12 (1 + 2 = 3)

    5 * 2 = 10 (1 + 0 = 1)

    8 * 2 = 16 (1 + 6 = 7)

    4 * 2 = 8

  2. Ajoutez maintenant tous les nombres à un chiffre de l’étape 1.

    4 + 4 + 8 + 2 + 3 + 1 + 7 + 8 = 37

  3. Ajoutez tous les chiffres aux endroits impairs de droite à gauche dans le numéro de carte.

    6 + 6 + 0 + 8 + 0 + 7 + 8 + 3 = 38

  4. Faites la somme des résultats des étapes 2 et 3.

    37 + 38 = 75

  5. Si le résultat de l'étape 4 est divisible par 10, le numéro de carte est valide. sinon, il est invalide. Par exemple, le numéro 4388576018402626 n'est pas valide, mais le numéro 4388576018410707 est valide.

Simplement, mon programme affiche toujours valide pour tout ce que j'ai entré. Même s'il s'agit d'un nombre valide et que le résultat des méthodes sumOfOddPlace et sumOfDoubleEvenPlace est égal à zéro. 
Toute aide est appréciée.

import Java.util.Scanner;
public class CreditCardValidation {
      public static void main(String[] args) {
     Scanner in = new Scanner(System.in);
        int count = 0;
        long array[] = new long [16];
       do
       {
        count = 0;
       array = new long [16];
        System.out.print("Enter your Credit Card Number : ");
        long number = in.nextLong();
        for (int i = 0; number != 0; i++) {
        array[i] = number % 10;
        number = number / 10;
        count++;
        }
       }
        while(count < 13); 
        if ((array[count - 1] == 4) || (array[count - 1] == 5) || (array[count - 1] == 3 && array[count - 2] == 7)){
            if (isValid(array) == true) {
                System.out.println("\n The Credit Card Number is Valid. ");
        } else {
            System.out.println("\n The Credit Card Number is Invalid. ");
        }
        } else{
          System.out.println("\n The Credit Card Number is Invalid. ");
        }
    }

    public static boolean isValid(long[] array) {
        int total = sumOfDoubleEvenPlace(array) + sumOfOddPlace(array);        
        if ((total % 10 == 0)) {
         for (int i=0; i< array.length; i++){
            System.out.println(array[i]);}
            return true;
        } else {
          for (int i=0; i< array.length; i++){
            System.out.println(array[i]);}
            return false;
        }
    }

    public static int getDigit(int number) {
        if (number <= 9) {
            return number;
        } else {
            int firstDigit = number % 10;
            int secondDigit = (int) (number / 10);
            return firstDigit + secondDigit;
        }
    }

    public static int sumOfOddPlace(long[] array) {
        int result = 0;
        for (int i=0; i< array.length; i++)
        {
        while (array[i] > 0) {
            result += (int) (array[i] % 10);
            array[i] = array[i] / 100;
         }}
         System.out.println("\n The sum of odd place is " + result);
        return result;
    }

    public static int sumOfDoubleEvenPlace(long[] array) {
        int result = 0;
        long temp = 0;
        for (int i=0; i< array.length; i++){
        while (array[i] > 0) {
             temp = array[i] % 100;
             result += getDigit((int) (temp / 10) * 2);
            array[i] = array[i] / 100;
           }
        }
        System.out.println("\n The sum of double even place is " + result);
        return result;
    }
     }
10
user3126388

Vous pouvez importer librement le code suivant:

public class Luhn
{
    public static boolean Check(String ccNumber)
    {
            int sum = 0;
            boolean alternate = false;
            for (int i = ccNumber.length() - 1; i >= 0; i--)
            {
                    int n = Integer.parseInt(ccNumber.substring(i, i + 1));
                    if (alternate)
                    {
                            n *= 2;
                            if (n > 9)
                            {
                                    n = (n % 10) + 1;
                            }
                    }
                    sum += n;
                    alternate = !alternate;
            }
            return (sum % 10 == 0);
    }
}

Référence du lien: https://github.com/jduke32/gnuc-credit-card-checker/blob/master/CCCheckerPro/src/com/gnuc/Java/ccc/Luhn.Java

24
Nicholas Ng

Google et Wikipedia sont vos amis. Au lieu de long-array, j'utiliserais int-array. Sur Wikipedia le code Java suivant est publié (avec l'explication détaillée de l'algorithme de Luhn):

   public static boolean check(int[] digits) {
     int sum = 0;
     int length = digits.length;
     for (int i = 0; i < length; i++) {

       // get digits in reverse order
       int digit = digits[length - i - 1];

       // every 2nd number multiply with 2
       if (i % 2 == 1) {
           digit *= 2;
       }
       sum += digit > 9 ? digit - 9 : digit;
     }
     return sum % 10 == 0;
   }

Vous devriez travailler sur votre code de traitement d'entrée. Je vous suggère d'étudier la solution suivante:

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    boolean repeat;
    List<Integer> digits = new ArrayList<Integer>();

    do {
        repeat = false;
        System.out.print("Enter your Credit Card Number : ");
        String input = in.next();

        for (int i = 0; i < input.length(); i++) {
            char c = input.charAt(i);
            if (c < '0' || c > '9') {
                repeat = true;
                digits.clear();
                break;
            } else {
                digits.add(Integer.valueOf(c - '0'));
            }
        }
    } while (repeat);

    int[] array = new int[digits.size()];
    for (int i = 0; i < array.length; i++) {
        array[i] = Integer.valueOf(digits.get(i));
    }
    boolean valid = check(array);
    System.out.println("Valid: " + valid);
}
9
Meno Hochschild

J'ai essayé avec Java 8:

public static boolean luhn(String cc) {
    final boolean[] dbl = {false};
    return cc
            .chars()
            .map(c -> Character.digit((char) c, 10))
            .map(i -> ((dbl[0] = !dbl[0])) ? (((i*2)>9) ? (i*2)-9 : i*2) : i)
            .sum() % 10 == 0;
}

Ajouter la ligne

            .replaceAll("\\s+", "")

Avant

            .chars()

Si vous voulez gérer les espaces.

Semble produire des résultats identiques à 

return LuhnCheckDigit.LUHN_CHECK_DIGIT.isValid(cc);

Du validateur commun d'Apache.

2
user2362840

Je vais utiliser des numéros de carte à 5 chiffres pour plus de simplicité. Disons que votre numéro de carte est 12345 ; si je lis correctement le code, vous enregistrez dans array les chiffres individuels:

array[] = {1, 2, 3, 4, 5}

Puisque vous avez déjà les chiffres, dans sumOfOddPlace, vous devriez faire quelque chose comme:

public static int sumOfOddPlace(long[] array) {
    int result = 0;
    for (int i = 1; i < array.length; i += 2) {
        result += array[i];
    }
    return result;
}

Et dans sumOfDoubleEvenPlace:

public static int sumOfDoubleEvenPlace(long[] array) {
    int result = 0;
    for (int i = 0; i < array.length; i += 2) {
        result += getDigit(2 * array[i]);
    }
    return result;
}
1
sebii
private static int luhnAlgorithm(String number){
    int n=0;
    for(int i = 0; i<number.length(); i++){
        int x = Integer.parseInt(""+number.charAt(i));
        n += (x*Math.pow(2, i%2))%10;
        if (x>=5 && i%2==1) n++;
    }
    return n%10;
}
0
nicoladc89