Search code examples
javascriptrangecomparison

Is there a more compact way of checking if a number is within a range?


I want to be able to test whether a value is within a number range. This is my current code:

if ((year < 2099) && (year > 1990)){
    return 'good stuff';
}

Is there a simpler way to do this? For example, is there something like this?

if (1990 < year < 2099){
    return 'good stuff';
}

Solution

  • In many languages, the second way will be evaluated from left to right incorrectly with regard to what you want.

    In C, for instance, 1990 < year will evaluate to 0 or 1, which then becomes 1 < 2099, which is always true, of course.

    Javascript is a quite similar to C: 1990 < year returns true or false, and those boolean expressions seem to numerically compare equal to 0 and 1 respectively.

    But in C#, it won't even compile, giving you the error:

    error CS0019: Operator '<' cannot be applied to operands of type 'bool' and 'int'

    You get a similar error from Ruby, while Haskell tells you that you cannot use < twice in the same infix expression.

    Off the top of my head, Python is the only language that I'm sure handles the "between" setup that way:

    >>> year = 5
    >>> 1990 < year < 2099
    False
    >>> year = 2000
    >>> 1990 < year < 2099
    True
    

    The bottom line is that the first way (x < y && y < z) is always your safest bet.