2009-12-08 3 views
11

Мы все знаем, что 42 is the answer to everything, но это новость для меня, что это действительный номер кредитной карты.Имеет ли действительный номер кредитной карты 42? jQuery validator считает, что это

Попробуйте ввести «42» или «42176» ​​в этот jQuery Validation testing page и нажмите «ОК».

Что происходит? Я думал, что это должна быть де-факто библиотека проверки. Даже Microsoft использует его сейчас, но он считает, что «42» и «42176» ​​являются действительными номерами кредитных карт ?! Это даже не проверка длины. Неужели я не отвечаю за добавление проверки длины? Он называется валидатором «creditcard», а не валидатором «luhn».

Редактировать: юмор автостопа в стороне - как бы я пошел по исправлению плагина проверки, чтобы проверить длину. это легко?

+5

Это ответ на всю жизнь и все остальное. Почему бы не быть действительным номером кредитной карты? –

+1

@Elijah: Потому что вопрос не «Что такое действительный номер кредитной карты?» –

+2

Я имею в виду вопрос, чей ответ - 42. –

ответ

12

Это, вероятно, потому, что этот валидатор просто проверяет, что предоставленное число удовлетворяет алгоритму LUHN-10 (который 42 удовлетворяет, поскольку 4 * 2 + 2 = 10, который равен 0 по модулю 10).

Лучшим валидатором может быть проверка минимального количества цифр.

Я не уверен, что это соответствует самому последнему коду из JQuery, но я нашел фрагмент, связанный с проверкой кредитной карты:

// 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; 
    }, 

... и, как вы видите, это просто проверить, что все символы являются цифрами и что LUHN-10 удовлетворен, без какого-либо внимания к миниатюрной длине.

+6

Ничего себе, какая дрянная процедура проверки. –

+0

@ed, к сожалению, да: -/ –

6

Длина номеров кредитных карт может варьироваться в зависимости от эмитента (хотя да, обычно минимальная длина составляет 13 цифр). Однако, поскольку это проверка на стороне клиента, фокус, вероятно, больше связан с уменьшением вероятности небольшой опечатки и меньше на проверку произвольных данных. Вероятно, это должно быть сделано на стороне сервера.

+0

, но проблема в том, что если вы уже ошиблись один раз - когда вы начинаете вводить текст, чтобы исправить это, он скажет вам *, как вы печатаете *, что это правильно, а затем неправильно, и затем снова исправьте. все кредитные карты должны быть не менее 15 символов вправо - так почему бы вам не сделать чек. У меня есть источник, я полагаю, но это просто заставляет меня уставать от использования этой библиотеки в целом. –

+0

Длина должна составлять от 13 до 19 цифр. – dave4420

+1

19-значный макс - это ограничение ISO 7812. Теоретически номер карты может составлять всего 6 цифр (для IIN), хотя на практике 13-значные карты являются самыми короткими, которые обычно выпускаются финансовой отраслью (и они больше не используются). – bobince

8

Вы можете комбинировать правило кредитной карты с правилами минимальной и максимальной длины для достижения желаемого. Это может показаться слишком большим усилием - и я могу согласиться - хотя это дает вам больше контроля, если вы хотите только принять определенные номера номеров.

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

спасибо! и КУРС Я хочу только принять номера CC определенной длины !!! –

0

Я исправил функцию проверки jQuery, чтобы рассмотреть длину кредитной карты при проверке.

Я добавил следующее проверки кредитной карты код-

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

Полный код для части проверки CreditCard заключается в следующем: -

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; 
}, 

Я жёстко минимум и максимум длина карт равна 12 и 19 соответственно.

Смежные вопросы