Search code examples
javascriptclamp

What's the most elegant way to cap a number to a segment?


Let's say x, a and b are numbers. I need to limit x to the bounds of the segment [a, b].

In other words, I need a clamp function:

clamp(x) = max( a, min(x, b) )

Can anybody come up with a more readable version of this?


Solution

  • The way you do it is pretty standard. You can define a utility clamp function:

    /**
     * Returns a number whose value is limited to the given range.
     *
     * Example: limit the output of this computation to between 0 and 255
     * (x * 255).clamp(0, 255)
     *
     * @param {Number} min The lower boundary of the output range
     * @param {Number} max The upper boundary of the output range
     * @returns A number in the range [min, max]
     * @type Number
     */
    Number.prototype.clamp = function(min, max) {
      return Math.min(Math.max(this, min), max);
    };
    

    (Although extending language built-ins is generally frowned upon)