I want to limit a number between two values, I know that in PHP you can do this:
$number = min(max(intval($number), 1), 20);
// this will make $number 1 if i
You have at least two options:
You can use a pair of conditional operators (? :):
number = number > 100 ? 100 : number < 0 ? 0 : number;
Or you can combine Math.max and Math.min:
number = Math.min(100, Math.max(0, number));
In both cases, it's relatively easy to confuse yourself, so you might consider having a utility function if you do this in multiple places:
function clamp(val, min, max) {
return val > max ? max : val < min ? min : val;
}
Then:
number = clamp(number, 0, 100);
Related: What's the most elegant way to cap a number to a segment?:
Update for ECMAScript 2017:
Math.clamp(x, lower, upper)But note that as of today, it's a Stage 1 proposal. Until it gets widely supported, you can use a polyfill.
I will share my robust function to enforce whole numbers (because of the integer tag), it has features like optional min/max parameters and -0 protection:
function toInt(val, min, max){
val=(val*1 || 0);
val=(val<0 ? Math.ceil(val) : Math.floor(val));
min*=1;
max*=1;
min=((Number.isNaN(min) ? -Infinity : min) || 0);
max=((Number.isNaN(max) ? Infinity : max) || 0);
return Math.min(Math.max(val, min), max);
}
Some quick notes:
(... || 0) behind the scenes is dealing with -0 to change it to 0, which is almost always what you want.min and max parameters are optional. When blank or invalid values are passed, they will turn into -Infinity and Infinity so they silently don't interfere with Math.min() and Math.max().Number.isNaN(x) ECMAScript-6 to x!==x (results in true only for NaN) for more compatibility with really old browsers, but this is simply not necessarily anymore.Use Math.min and Math.max.
like this
var number = Math.min(Math.max(parseInt(number), 1), 20);
function limitNumberWithinRange(num, min, max){
const MIN = min || 1;
const MAX = max || 20;
const parsed = parseInt(num)
return Math.min(Math.max(parsed, MIN), MAX)
}
alert(
limitNumberWithinRange( prompt("enter a number") )
)
Needs no further explanation:
function clamp(value, min, max) {
return Math.min(Math.max(value, min), max);
}