检查数字是否按顺序排列

时间:2017-09-19 09:18:49

标签: jquery

我有一个包含maxlength 4的文本框,如果用户按顺序输入数字,则需要抛出错误。

示例:以下是几个需要阻止的示例:

1234,4567,5678等

它可以接受1233,4568等

我在Jquery或JavaScript中期待这种情况。

任何帮助将不胜感激

代码:我想使用以下格式的代码:

$.validator.addMethod("Pin", function(b) {

var a = true;

**a = (/^([0-9] ?){4}$/i).test(b);**

return a

}, "");

我们可以替换粗体条件。

5 个答案:

答案 0 :(得分:2)

最简单的解决方案是使用以下代码

/**
* The sequential number would always be a subset to "0123456789".
* For instance, 1234, 4567, 2345, etc are all subset of "0123456789".
* To validate, this function uses 'indexOf' method present on String Object.
* you can read more about 'indexOf' at https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf
*/
$.validator.addMethod("Pin", function(b) {
  var numbers = "0123456789";
  //If reverse sequence is also needed to be checked
  var numbersRev = "9876543210";
  //Returns false, if the number is in sequence
  return numbers.indexOf(String(b)) === -1 && numbersRev.indexOf(String(b)) === -1;    
}, "");

只有在需要反向序列验证时才需要变量numbersRev的条件

答案 1 :(得分:0)

你可以这样做:

//with array
var numArray = [1234, 1243];
for (var i = 0; i < numArray.length; i++) {
  checkIfSequential(numArray[i]);
}

//with string
var numberGiven = 1234;
checkIfSequential(numberGiven);


function checkIfSequential(num) {
  var newNum = num + ''
  newNum = newNum.split('');
  console.log(num + ': ' + newNum.every((num, i) => i === newNum.length - 1 || num < newNum[i + 1]));
}

答案 2 :(得分:0)

我明白你的观点, 为什么不在HTML本身设置输入字段的最大长度,然后将 keyup 事件绑定到输入框以触发验证?

例如:

<input type="text" maxlength="4" onkeyup="validateMe()" id="key"/>

<script>
validateMe = function(){
 if(document.getElementById("key").value == "1234"){
    alert("yay! Key accepted!!");
 }
};
</script>

答案 3 :(得分:0)

您可以简单地将引脚分成单独的数字,并迭代它们以确保至少有一个部分不按顺序排列(即+2或更多的差异):

$.validator.addMethod("Pin", function(value, element) {
  var digits = value.split(''),
      invalid = true;

  // Iterate through pairs of values
  // As long as one comparison is not consecutive, the PIN is valid
  for(var i = 0; i < digits.length - 1; i++) {
    if (parseInt(digits[i]) - parseInt(digits[i+1]) > 1) {
      invalid = false;
      break;
    }
  }

  return !invalid;
}, "");

如果您还想要适应下降序列的情况,即9876,只需检查一个数字与另一个数字之间的绝对差异,即:

Math.abs(parseInt(digits[i]) - parseInt(digits[i+1])) > 1

概念验证逻辑:

// Test values
var values = ['1234', '1235', '4321', '5321'];

for(var v = 0; v < values.length; v++) {
  var value = values[v],
      digits = value.split(''),
      invalid = true;
      
  for(var i = 0; i < digits.length - 1; i++) {
    if (Math.abs(parseInt(digits[i]) - parseInt(digits[i+1])) > 1) {
      invalid = false;
      break;
    }
  }
  
  console.log('PIN: ' + value + '. Valid? ' + !invalid);
}

答案 4 :(得分:0)

为了满足4位最大长度的要求。 我们根据OP约束[1234, 2345, 3456, 4567, 5678, 6789]枚举所有可能的顺序数字,然后使用input参数对其进行检查。

const sequentialDigits = (input) => {
  const allSeqNumsArr = [1234, 2345, 3456, 4567, 5678, 6789];
  return allSeqNumsArr.filter((num) => num === input).length > 0;
};

console.log(sequentialDigits(1234));
console.log(sequentialDigits(1235));
console.log(sequentialDigits(5321));