Sprawdź, czy wartość należy do zakresu liczb


110

Chcę sprawdzić, czy wartość mieści się w akceptowanym zakresie. Jeśli tak, coś zrobić; w przeciwnym razie coś innego.

Zakres wynosi 0.001-0.009. Wiem, jak użyć wielu, ifaby to sprawdzić, ale chcę wiedzieć, czy istnieje sposób, aby to sprawdzić w pojedynczym ifoświadczeniu.


14
&&operator? ...
Šime Vidas

Odpowiedzi:


219

Zadajesz pytanie dotyczące porównań liczbowych, więc wyrażenia regularne naprawdę nie mają nic wspólnego z problemem. Nie potrzebujesz do tego „wielu if” instrukcji:

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

Możesz napisać sobie funkcję „between ()”:

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

Twoje kodowanie jest dobre, ale nie pasuje do pytania, to wszystko. Bez urazy. Zawsze oceniam rozwiązanie na podstawie tego, jak dobrze odpowiada na pytanie. To dlatego, że ogólnie zakładam, że ludzie wiedzą, o co proszą. Znacznik wyboru pokazuje, że tak nie było w przypadku tego pytającego.
Leif

7
Cóż, doceniam to, co mówisz, ale sugeruję, abyś zechciał ponownie rozważyć założenie, że ludzie tutaj na ogół „wiedzą, o co proszą”. Może to być prawdą w bardzo wąskim znaczeniu, ale często te pytania odzwierciedlają jakąś złą decyzję projektową, którą należy ponownie rozważyć. Odpowiadam na pytania programistyczne od około 30 lat, więc widziałem to wiele razy. Oczywiście wolę lepsze pytania, w których ogólny cel jest jasno wyjaśniony. Tutaj naprawdę nie mamy pojęcia o przyczynie pytania, więc nie mamy kontekstu.
Pointy

6
Lubię używać takiej składni: if (0,001 <= x && x <= 0,009) {...} wydaje mi się nieco jaśniejsze :)
Omri,

50

Oto opcja z tylko jednym porównaniem.

// 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

To słodkie, nie ma znaczenia, czy min jest niższe, czy max jest niższe, nadal będzie działać. Właściwie lepiej byłoby nazwać min, max coś w rodzaju start, end. wielki algo tak czy inaczej, dzięki!
James Harrington,

19

Jeśli musisz użyć wyrażenia regularnego (a naprawdę nie powinieneś!) To zadziała:

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

powinno działać, tj

  • ^ nic wcześniej,
  • po którym następuje 0.00(nb: ukośnik odwrotny dla .znaku)
  • po którym następuje od 1 do 8 i dowolna liczba dodatkowych cyfr
  • lub 9, po których następuje dowolna liczba zer
  • $: po czym nic innego

8

Jeśli już używasz lodash, możesz skorzystać z inRange()funkcji: https://lodash.com/docs/4.17.15#inRange

_.inRange(3, 2, 4);
// => true

_.inRange(4, 8);
// => true

_.inRange(4, 2);
// => false

_.inRange(2, 2);
// => false

_.inRange(1.2, 2);
// => true

_.inRange(5.2, 4);
// => false

_.inRange(-3, -2, -6);
// => true

3

Podoba mi się betweenfunkcja Pointy, więc napisałem podobną, która działała dobrze w moim scenariuszu.

/**
 * 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;
}

więc jeśli chcesz sprawdzić, czy xmieści się w zakresie ± 10 od y:

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

Używam go do wykrywania długiego naciśnięcia na telefonie komórkowym:

//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);

1

Jeśli chcesz, aby kod wybierał określony zakres cyfr, pamiętaj, aby użyć &&operatora zamiast ||.

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

Przed zapisaniem warunku musisz określić dolną i górną granicę

function between(value,first,last) {

 let lower = Math.min(first,last) , upper = Math.max(first,last);
 return value >= lower &&  value <= upper ;

}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.