Created
October 25, 2011 10:25
-
-
Save rodneyrehm/1312184 to your computer and use it in GitHub Desktop.
JS: Integer Range Validation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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