Estoy tratando de crear un programa para validar 10 a 12 dígitos largo número de secuencias basado en el algoritmo de luhn, pero mi programa se mantiene en mí que me decía que cada número no es válido aun cuando no lo sean.
Este número debería ser válido, pero mi código no lo creo: 8112189876
Este número no debe ser válida, que mi programa está de acuerdo con el, ya que piensa que cada número no es válido: 8112189875
Aquí está mi código:
static void luhn(){
System.out.print("Enter number to validate:\n");
String pnr = input.nextLine();
int length = pnr.length();
int sum = 0;
for (int i = 1, pos = length - 1; i < 10; i++, pos--){
char tmp = pnr.charAt(pos);
int num = tmp - 0
int product;
if (i % 2 != 0){
product = num * 1;
}
else{
product = num * 2;
}
if (product > 9)
product -= 9;
sum+= product;
boolean valid = (sum % 10 == 0);
if (valid){
System.out.print("Valid!\r");
}
else{
System.out.print("Invalid!");
}
}
}
- ericlippert.com/2014/03/05/how-to-debug-small-programs; el paso a través de este programa que se ejecuta con un depurador. Me pregunto si
tmp
tiene el valor que usted espera."1".charAt(0)
no es igual a 1. Trate deInteger.parseInt()
. int num = tmp - 0
Bastante seguro de que esta línea devuelve el ASCII char valor más que el valor de un dígito, no?
La primera cosa que veo es que usted tiene:
En su lugar usted debe tener:
En segundo lugar, usted debe validar su suma fuera de la
for
bucle, porque sólo se preocupan por la suma después de procesar todos los dígitos.En tercer lugar, que está empezando desde el final de la serie, y que no están incluidos en el primer número de su cadena. ¿Por qué no utilizar
i
para ambas tareas?Resultante (de trabajo) método:
Estilísticamente, este método sería más útil si, en lugar de la firma del método
lugar había firma del método
Esta facilidad permite que su código para obtener el
String
de CUALQUIER fuente (un archivo codificado, etc.) y hacer cualquier cosa con el resultado (imprimir un mensaje como el suyo, o hacer algo más). Obviamente podría mover elSystem.out.print
,input.nextLine()
, yif(valid)
bits de código fuera de este método.Completo refactorizado programa:
uso
org.apache.commons.validator.routines.checkdigit.LuhnCheckDigit.LUHN_CHECK_DIGIT.isValid(number)
Maven Dependencia:
Puedo utilizar esta función en una aplicación para comprobar el número de la tarjeta de validez :
La esperanza de que esto ayude,
Usted debe restar ‘0’ de la ptm, no 0. Restando 0, devuelve el valor ASCII, que no desea.
String
,Character
ychar
uso de Unicode/UTF-16, no ASCII.He aquí algunas de las funciones que le escribí a ambos calcular el dígito de control de un número dado y para verificar un determinado número de secuencia y extraer el número de ella.
Para calcular el dígito de control de un número dado:
Para verificar una secuencia de dígitos, usando el algoritmo de Luhn y extraer el número:
Los recién llegados a este post/pregunta puede comprobar apropiado Página de la Wikipedia para la solución. A continuación está el código Java copia-pega desde allí.
Si el uso de Java 10 o superior, puede utilizar el código siguiente:
Es el enfoque funcional a este algoritmo.