web-dev-qa-db-fra.com

Vérifier si une valeur est dans une plage de nombres

Je veux vérifier si une valeur est dans une plage acceptée. Si oui, faire quelque chose; sinon, autre chose.

La plage est 0.001-0.009. Je sais comment utiliser plusieurs if pour vérifier cela, mais je veux savoir s’il existe un moyen de le vérifier dans une seule instruction if.

65
Sotiris

Vous posez une question sur les comparaisons numériques, de sorte que les expressions régulières n’ont vraiment rien à voir avec le problème. Vous n'avez pas besoin d'instructions "multiple if" pour le faire:

if (x >= 0.001 && x <= 0.009) {
  // something
}

Vous pourriez écrire vous-même une fonction "between ()":

function between(x, min, max) {
  return x >= min && x <= max;
}
// ...
if (between(x, 0.001, 0.009)) {
  // something
}
154
Pointy

Si vous devez utilisez une expression rationnelle (et vraiment, vous ne devriez pas!), Cela fonctionnera:

/^0\.00([1-8]\d*|90*)$/

devrait fonctionner, c'est-à-dire.

  • ^ rien avant,
  • suivi de 0.00 (nb: échappement de barre oblique inverse pour le caractère .)
  • suivi de 1 à 8 et d'un nombre quelconque de chiffres supplémentaires
  • ou 9, suivi d'un nombre quelconque de zéros
  • $: suivi de rien d'autre
16
Alnitak

Voici une option avec une seule comparaison.

// return true if in range, otherwise false
function inRange(x, min, max) {
    return ((x-min)*(x-max) <= 0);
}

console.log(inRange(5, 1, 10));     // true
console.log(inRange(-5, 1, 10));    // false
console.log(inRange(20, 1, 10));    // false
13
Alexander

J'aime la fonction between de Pointy, alors j’en ai écrit une similaire qui convient à mon scénario.

/**
 * Checks if an integer is within ±x another integer.
 * @param {int} op - The integer in question
 * @param {int} target - The integer to compare to
 * @param {int} range - the range ±
 */
function nearInt(op, target, range) {
    return op < target + range && op > target - range;
}

donc si vous voulez voir si x est dans ± 10 sur y:

var x = 100;
var y = 115;
nearInt(x,y,10) = false

Je l'utilise pour détecter un appui long sur un mobile:

//make sure they haven't moved too much during long press.
if (!nearInt(Last.x,Start.x,5) || !nearInt(Last.y, Start.y,5)) clearTimeout(t);
2
Scott Beeson

Si vous souhaitez que votre code sélectionne une plage de chiffres spécifique, veillez à utiliser l'opérateur && au lieu du ||

if (x >= 4 && x <= 9) {
  // do something
} else {
  // do something else
}

// be sure not to do this

if (x >= 4 || x <= 9) {
  // do something
} else {
  // do something else
}

0
Fay Vor