Skip to content

Instantly share code, notes, and snippets.

@rodneyrehm
Created October 25, 2011 10:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rodneyrehm/1312184 to your computer and use it in GitHub Desktop.
Save rodneyrehm/1312184 to your computer and use it in GitHub Desktop.
JS: Integer Range Validation
// regarding http://stackoverflow.com/questions/7887157/constructing-regular-expressions-to-match-numeric-ranges
function IntRangeTest(expression) {
var tests = [];
/*
possible expressions:
"*" - any integer
"0,3-4" - 0 or between 3 and 4
"0,-10--4" - 0 or between -10 and -4
"0, -10 - -4" - 0 or between -10 and -4
note: modifying this to allow negative values is up to you
*/
if (expression == '*') {
// only test for integer
} else {
// explode multiple tests
var t = expression.split(',');
for (var i=0, e; e = t[i]; i++) {
// explode range
var r = e.match(/\s*(-?\d+)\s*(-\s*(-?\d+))?\s*/);
if (!r) {
// did not match anything
} else if (typeof r[3] == 'undefined') {
// matched single number
tests.push({
equals: parseInt(r[1], 10)
});
} else {
// matched range
r[1] = parseInt(r[1], 10);
r[3] = parseInt(r[3], 10);
tests.push({
lower: Math.min(r[1], r[3]),
upper: Math.max(r[1], r[3])
});
}
}
}
this.test = function(value) {
if (typeof value != "number" && !(value+"").match(/^-?\d+$/)) {
// not a number
return false;
}
if (!tests.length) {
return true;
}
value = parseInt(value, 10);
for (var i=0, test; test = tests[i]; i++) {
if (typeof test.equals == "number") {
if (test.equals == value) {
return true;
}
} else {
if (value >= test.lower && value <= test.upper) {
return true;
}
}
}
return false;
};
}
var range;
range = new IntRangeTest('*');
console.log(
"*",
range.test("") == false,
range.test("-5") == true,
range.test("0") == true,
range.test("5") == true,
range.test("11") == true,
range.test("123.23") == false
);
range = new IntRangeTest('0,10-20');
console.log(
"0,10-20",
range.test("") == false,
range.test("-5") == false,
range.test("0") == true,
range.test("5") == false,
range.test("11") == true,
range.test("123.23") == false
);
range = new IntRangeTest('0, -10 - 20');
console.log(
"0, -10 - 20",
range.test("") == false,
range.test("-5") == true,
range.test("0") == true,
range.test("5") == true,
range.test("11") == true,
range.test("123.23") == false
);
range = new IntRangeTest('0, -10 - -20');
console.log(
"0, -10 - -20",
range.test("") == false,
range.test("-5") == false,
range.test("0") == true,
range.test("5") == false,
range.test("11") == false,
range.test("123.23") == false,
range.test("-11") == true,
range.test("-21") == false
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment