2009-12-08 4 views
11

Sappiamo tutti che 42 is the answer to everything, ma è una novità per me che si tratta di un numero di carta di credito valida.Il numero di carta di credito è 42? validatore jQuery pensa che sia

Provare a immettere "42" o "42176" in questo jQuery Validation testing page e fare clic su OK.

Cosa sta succedendo? Pensavo che questa doveva essere la biblioteca di validazione di fatto. Anche Microsoft lo sta usando ora, ma pensa che "42" e "42176" siano numeri di carta di credito validi ?! Non sta nemmeno facendo un controllo di lunghezza. Sicuramente non sono responsabile per l'aggiunta di un controllo di lunghezza troppo? Si chiama validatore "credit card" e non validatore "luhn".

Modifica: umorismo autostoppista a parte - come potrei andare a correggere il plug-in di convalida per verificare la lunghezza. è così facile?

+5

È la risposta alla vita dell'universo e di tutto. Perché non dovrebbe essere un numero di carta di credito valido? –

+1

@Elijah: Perché la domanda non è "Qual è un numero di carta di credito valido?" –

+2

Voglio dire, la domanda la cui risposta è 42. –

risposta

12

Ciò è probabilmente dovuto al fatto che questo validatore controlla semplicemente che il numero fornito soddisfi l'algoritmo LUHN-10 (che 42 soddisfa da 4 * 2 + 2 = 10 che è 0 modulo 10).

Un validatore migliore dovrebbe forse verificare un numero minimo di cifre.

io non sono sicuro che questo corrisponde al più recente codice jQuery, ma ho trovato il frammento di codice associato con la convalida della carta di credito:

// http://docs.jquery.com/Plugins/Validation/Methods/creditcard 
    // based on http://en.wikipedia.org/wiki/Luhn 
    creditcard: function(value, element) { 
     if (this.optional(element)) 
      return "dependency-mismatch"; 
     // accept only digits and dashes 
     if (/[^0-9-]+/.test(value)) 
      return false; 
     var nCheck = 0, 
      nDigit = 0, 
      bEven = false; 

     value = value.replace(/\D/g, ""); 

     for (n = value.length - 1; n >= 0; n--) { 
      var cDigit = value.charAt(n); 
      var nDigit = parseInt(cDigit, 10); 
      if (bEven) { 
       if ((nDigit *= 2) > 9) 
        nDigit -= 9; 
      } 
      nCheck += nDigit; 
      bEven = !bEven; 
     } 

     return (nCheck % 10) == 0; 
    }, 

... e come si vede questo solo controllare che tutti i personaggi sono cifre e che LUHN-10 è soddisfatto, senza alcuna attenzione a una lunghezza minima.

+6

Wow, che schifosa routine di validazione. –

+0

@ed Purtroppo sì: -/ –

6

La lunghezza dei numeri di carta di credito può variare a seconda dell'emittente (anche se sì, in genere c'è una lunghezza minima di ~ 13 cifre). Tuttavia, poiché si tratta della convalida sul lato client, l'attenzione è probabilmente maggiore sulla riduzione delle possibilità di errore di battitura e meno sul controllo di dati arbitrari. Questo dovrebbe probabilmente essere fatto lato server.

+0

ma il problema è che se hai già sbagliato una volta - come si inizia a iniziare a digitare per correggerlo vi dirà * come sei digitando * che il suo corretto, quindi sbagliato, e quindi correggi nuovamente. tutte le carte di credito devono avere almeno 15 caratteri a destra - quindi perché non sta facendo un assegno. Ho la fonte, suppongo, ma mi rende solo stanco di usare questa libreria in generale. –

+0

La lunghezza deve essere compresa tra 13 e 19 cifre, in generale. – dave4420

+1

Il max 19 cifre, è una limitazione della ISO 7812. Teoricamente un numero di carta potrebbe essere da un minimo di 6 cifre (per l'IIN), anche se in pratica le schede a 13 cifre sono il più breve che sono stati comunemente rilasciato dal settore finanziario (e non sono più in uso). – bobince

8

È possibile combinare la regola della carta di credito con le regole della lunghezza minima e massima per ottenere ciò che si desidera. Potrebbe sembrare uno sforzo eccessivo - e potrei essere d'accordo - sebbene ti dia più controllo se vuoi solo accettare determinate lunghezze di numero di tessera.

$('form').validate({ 
    '#ccNum': { 
        creditcard: true, 
        required: true, 
        minlength: 13, 
        maxlength: 19 
       } 
}); 
+0

grazie! e DI CORSO, voglio solo accettare numeri CC di determinate lunghezze !!! –

0

Ho corretto la funzione di jQuery convalida di prendere in considerazione la lunghezza carta di credito in validazione.

ho aggiunto il seguente alla validazione carta di credito code-

if (value.length > 19 || value.length<12) 
{ 
    return (false); 
} 

Il codice completo per la parte di convalida carta di credito è la seguente: -

creditcard: function(value, element) { 
if (this.optional(element)) 
return "dependency-mismatch"; 
// accept only digits and dashes 
if (/[^0-9-]+/.test(value)) 
return false; 

// Modified part to check minimum and maximum card length 
if (value.length > 19 || value.length<12) 
{ 
    return (false); 
} 

var nCheck = 0, 
nDigit = 0, 
bEven = false; 
value = value.replace(/\D/g, ""); 

for (n = value.length - 1; n >= 0; n--) { 
var cDigit = value.charAt(n); 
var nDigit = parseInt(cDigit, 10); 
if (bEven) { 
if ((nDigit *= 2) > 9) 
nDigit -= 9; 
} 
nCheck += nDigit; 
bEven = !bEven; 
} 

return (nCheck % 10) == 0; 
}, 

ho codificato duro il minimo e il massimo lunghezze della carta come 12 e 19 rispettivamente.