Valider le numéro de carte de crédit à l'aide de l'algorithme de luhn
J'ai une question concernant la suite de la programmation de l'affectation.
Numéros de carte de crédit de suivre certaines tendances. Une carte de crédit doit avoir entre 13 et 16 chiffres. Il doit commencer par:
• 4 pour les cartes Visa
• 5 pour le Master cartes
• 37 pour les cartes American Express
En 1954, Hans Luhn d'IBM a proposé un algorithme de validation des numéros de carte de crédit. L'algorithme est utile pour déterminer si un numéro de carte est saisi correctement ou si une carte de crédit est numérisé correctement par un scanner. Presque tous les numéros de carte de crédit sont générés à la suite de cette vérification de sa validité, communément connu sous le Luhn chèque ou le Module 10, qui peut être décrit comme suit. Pour illustration, considérons le numéro de la carte 4388576018402625.
- Double à chaque seconde chiffres de droite à gauche. Si le doublement du chiffre résultats dans une partie à 2 chiffres, additionnez les deux chiffres pour obtenir un seul chiffre.
2 x 2 = 4
2 x 2 = 4
4 x 2 = 8
1 x 2 = 2
6 x 2 = 12 (1+2= 3)
5 x 2 = 10 (1+0= 1)
8 x 2 = 16 (1+6= 7)
4 x 2 = 8
- Ajouter tous les numéros à deux chiffres à partir de l'étape 1
4 + 4 +8 + 2 +3 + 1 + 7 + 8 = 37 - Ajouter tous les chiffres dans les recoins de la droite vers la gauche dans le numéro de la carte
5 + 6 + 0 + 8 + 0 + 7 + 8 + 3 = 37
- La somme des résultats à partir de l'étape 2 et l'étape 3
37 + 37 = 74 - Si le résultat de l'étape est divisible par 10, le numéro de la carte est valide; sinon, il est invalide. Par exemple, le nombre 4388576018402625 est pas valide, mais le nombre 4388576018410707 est un Visa en cours de validité de la carte; le numéro de 6011000593748745 est pas valide, mais le nombre 6011000593748746 est valide carte à Découvrir.
J'ai essayé de le résoudre, comme illustré dans le code suivant:
import java.util.Scanner;
public class CreditCardValidation {
public static boolean isValid(long number) {
int total = sumOfDoubleEvenPlace(number) + sumOfOddPlace(number);
if ((total % 10 == 0) && (prefixMatched(number, 1) == true) && (getSize(number)>=13 ) && (getSize(number)<=16 )) {
return true;
} else {
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 number) {
int result = 0;
while (number > 0) {
result += (int) (number % 10);
number = number / 100;
}
return result;
}
public static int sumOfDoubleEvenPlace(long number) {
int result = 0;
long temp = 0;
while (number > 0) {
temp = number % 100;
result += getDigit((int) (temp / 10) * 2);
number = number / 100;
}
return result;
}
public static boolean prefixMatched(long number, int d) {
if ((getPrefix(number, d) == 4)
|| (getPrefix(number, d) == 5)
|| (getPrefix(number, d) == 3)) {
if (getPrefix(number, d) == 3) {
System.out.println("\nVisa Card ");
} else if (getPrefix(number, d) == 5) {
System.out.println("\nMaster Card ");
} else if (getPrefix(number, d) == 3) {
System.out.println("\nAmerican Express Card ");
}
return true;
} else {
return false;
}
}
public static int getSize(long d) {
int count = 0;
while (d > 0) {
d = d / 10;
count++;
}
return count;
}
public static long getPrefix(long number, int k) {
if (getSize(number) < k) {
return number;
} else {
int size = (int) getSize(number);
for (int i = 0; i < (size - k); i++) {
number = number / 10;
}
return number;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter a credit card number as a long integer: ");
long input = sc.nextLong();
if (isValid(input) == true) {
System.out.println("\n" + input + " is Valid. ");
} else {
System.out.println("\n" + input + " is Invalid. ");
}
}
}
Ma question est comment puis-je utiliser un tableau pour stocker le numéro de carte de crédit au lieu d'utiliser un numéro de long.
String
...J'ai donné une réponse à votre deuxième post de la apparemment même question aujourd'hui - voir link .
OriginalL'auteur user3126388 | 2013-12-22
Vous devez vous connecter pour publier un commentaire.
Il y a deux façons de diviser votre
int
enList<Integer>
%10
que vous utilisez, et le stocker dans unList
String
et ensuite prendre les valeurs numériquesVoici quelques exemples rapides
OriginalL'auteur Boris the Spider
c'est l'algorithme de luhn mise en œuvre que j'utilise pour seulement 16 chiffres du Numéro de Carte de Crédit
Si vous voulez utiliser sur n'importe quel numéro de remplacer tous les 16 avec votre numéro d'entrée de longueur.
Il va travailler pour le Visa numéro de la question.(Je l'ai testé)
OriginalL'auteur Piyush
Voici ma mise en œuvre de la Formule Luhn.
Je passe dans la carte comme
c
qui je l'obtenir à partir d'un Scanner et de stocker danscard
, et pourcn
je passecheckNumber = card.charAt( (card.length() - 1) );
.OriginalL'auteur DigiDuncan
Ok, cela peut être résolu avec une conversion de type chaîne de caractères et certains de Java 8
des trucs. N'oubliez pas les numéros et les caractères représentant les nombres ne sont pas les mêmes. '1' != 1
Vous pouvez maintenant utiliser cette méthode pour effectuer l'algorithme de luhn:
OriginalL'auteur Dun
OriginalL'auteur user3328528