Перевірте, чи не знаходиться значення в діапазоні чисел


109

Я хочу перевірити, чи є значення у прийнятому діапазоні. Якщо так, зробити щось; інакше щось інше.

Асортимент є 0.001-0.009. Я знаю, як використовувати декілька, ifщоб перевірити це, але я хочу знати, чи є спосіб перевірити це в одному ifоператорі.


14
&&оператор? ...
Šime Vidas

Відповіді:


218

Ви ставите запитання про числові порівняння, тому регулярні вирази дійсно не мають нічого спільного з проблемою. Для цього вам не потрібні "кілька if" заяв:

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

Ви можете написати собі функцію "між ()":

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

Ваше кодування добре, але воно не відповідає питанню, ось і все. Без образ. Я завжди суджу рішення про те, наскільки добре він відповідає на питання. Це тому, що я загалом припускаю, що люди знають, про що вони просять. Галочка показує, що це не було з цим запитувачем.
Лейф

7
Ну, я ціную те, що ви говорите, але я пропоную вам, можливо, захочете переглянути передумову про те, що люди, як правило, «знають, про що вони просять». Це може бути правдою в дуже вузькому сенсі, але часто ці питання відображають якесь невдале дизайнерське рішення, яке слід переглянути. Я відповідаю на питання програмування вже близько 30 років, тому багато разів бачив. Я, звичайно, віддаю перевагу кращим питанням, де загальна мета чітко пояснена. Тут ми справді не маємо уявлення про причину питання, тому у нас немає контексту.
Pointy

6
Мені подобається використовувати синтаксис так: якщо (0,001 <= x && x <= 0,009) {...} мені здається трохи зрозумілішим :)
Омрі,

50

Ось варіант лише з одним порівнянням.

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

Це солодко, неважливо, що мінімум нижче, а макс нижче - він все одно працюватиме. Насправді може бути краще зателефонувати до min, max щось на кшталт початку, кінця. чудовий альго так чи інакше дякую!
Джеймс Харрінгтон

19

Якщо ви повинні використовувати регулярний вираз (і справді, не слід!), Це спрацює:

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

повинен працювати, тобто

  • ^ нічого раніше,
  • після чого 0.00(nb: втеча зворотної косої риси для. персонажа)
  • Далі слід від 1 до 8 та будь-яка кількість додаткових цифр
  • або 9, після чого дорівнює будь-яка кількість нулів
  • $: далі нічого іншого

8

Якщо ви вже використовуєте lodash, ви можете скористатись inRange()функцією: 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

Мені подобається betweenфункція Pointy, тому я написав подібну, яка добре працювала для мого сценарію.

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

тож якщо ви хотіли дізнатись, чи xзнаходиться в межах ± 10 від y:

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

Я використовую це для виявлення тривалого натискання на мобільному:

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

Якщо ви хочете, щоб ваш код обрав певний діапазон цифр, обов'язково використовуйте &&оператор замість ||.

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

Потрібно визначити нижню та верхню межу, перш ніж писати умову

function between(value,first,last) {

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

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.