2016-08-12 5 views
-1

J'essaie de valider un numéro de carte de crédit avec Javascript basé sur la formule de Luhn. Je me rends compte qu'il y a des plugins pour ça, mais je voulais essayer tout seul. J'ai inclus un test credit card number qui est censé être valide. Malheureusement, je reçois des résultats invalides. Donc, je suppose que j'ai fait une erreur dans ma logique. Je cherche de l'aide pour voir où j'ai pu me tromper.Erreurs de validation CC (LuhnFormula)

var ccNumber = "5185763365093706"; 
var finalArray = []; 
var lastNumber; 

function validateCC() { 
    // convert CCNumber to array 
    var ccArray = ccNumber.split(""); 
    // Remove the last number from the array, and store it as a number in a variable 
    lastNumber = ccArray.pop() * 1; 

    var ccReverse = Array.prototype.slice.call(ccArray).reverse(); 

    for(var i = 0; i < ccReverse.length; i++) { 
    var newNumber; 

    // for all the odd numbers in the 
    if(i %2 === 0) { 
     // multiply each odd numbered array item by 2 
     var newCalc = ccReverse[i] * 2; 
     var finalCalc; 

     // check to see if the resulting calculation is greater than 9 
     (function() { 
     if(newCalc > 9) { 
      finalCalc = newCalc - 9; 
     } else { 
      finalCalc = newCalc; 
     } 
     })(); 
     // push each odd number to the finalArray 
     finalArray.push(finalCalc); 
    } 
    } 
} 

validateCC(); 

// Add up all the numbers in the final array 

var total = (finalArray.reduce(addArray, 0)); 

function addArray(a, b) { 
return a + b; 
} 

// The number above should be valid, but it's returning false. 
if(total % 10 === lastNumber) { 
    console.log("Is a valid credit card"); 
} else { 
    console.log("Is not a valid credit card"); 
} 

J'ai aussi fortement commenté jsbin: Toute aide est grandement appréciée.

Répondre

0

Ceci est une petite implémentation de formule Luhn modifiée.

function validateCC(elem){ 
 
    var s = elem.value.replace(/\D/g, '')//sanitize 
 
     .split('')//produce array 
 
     .reverse(); 
 
    if (!s.length || s.length < 15 || s.length > 16) {//15 for AmEx 16 for others 
 
    console.log('validation failed'); 
 
    return false; 
 
    } 
 
    //1st element is not excluded so final sum % 10 must be 0 
 
    var v = "";//string for sure 
 
    for (var i = 0, n = s.length; i < n; ++i) { 
 
    //no need "- 9" 
 
    //for example 8 * 2 = 16 
 
    //16 - 9 = 7 
 
    //1 + 6 = 7 
 
    v += s[i] * ((i % 2) + 1);//concatenate string 
 
    } 
 
    s = v.split('');//reuse var 
 
    v = 0;//this time int 
 
    i = 0; 
 
    while (!isNaN(s[i])) { 
 
    v += (s[i++] - 0);//- 0 for parseInt 
 
    } 
 
    if (v == 0 || v % 10) {//all 0000 fail 
 
    console.log('validation failed'); 
 
    return false; 
 
    } 
 
    console.log('Card is valid'); 
 
    return true; 
 
    }
<input type="text" onchange="validateCC(this)" />

+0

Merci pour les commentaires. Je vais jeter un coup d'oeil et voir comment je peux apporter des améliorations sur la base de l'exemple que vous avez posté. – somecallmejosh