Cравнение целого и не совсем целого числа

На странице цена товара: ‘8 млн руб‘.

Задача: сравнить цену товара с эталоном ’10’. Если цена выше 10 – сообщать о проблеме. Если цена ниже 10 – спокойно продолжаем проверки.

Решение: в несколько шагов.

Понятно, что сперва надо сохранить текст в переменную.

| storeText | css=span[name=”price”] | maxprice

Теперь в переменной надо оставить от текста ‘8,8 млн руб’ только цифру. Это мы сделаем посредством replace. Затем надо будет сравнить итоговую цифру с эталоном.

Эти два шага можно сделать одним элегантным движением:

| storeEval | if (storedVars[‘maxprice’].replace(” млн руб.”, “”) <= 10 ) {} else {alert(“Price is higer than 10”)}

Читаем: если значение переменной ‘maxprice’ меньше или равно 10, то ничего не делать.

Если значение переменной ‘maxprice’ выше  10, то выдаем alert (“Ахтунг, Покрышкин в воздухе!”).

Вероятная проблема: разделителем циферок будет запятая. Если на странице будет текст: ‘8.5 млн руб’, то скрипт все правильно сравнит. Если же текст будет ‘8,5 млн руб’, то скрипт забьется в истерике, потому что значение ему предлагают априори несравниваемое.

Вероятное решение: если допустимо, следует сделать замену не только букв, но и запятых на точки – еще одна строка кода. Некрасиво, но работает.

6 thoughts on “Cравнение целого и не совсем целого числа

  1. Задача: нужно сравнить две дроби (напр. “10/3 руб” и “3 руб 33 коп”), если нужно делить итд

    Вероятное решение: парсим строки и приводим к рациональному числу, а дальше как в лабе из универа – if( abs(value1 – value2) > epsilon ), где epsilon – нужная точность (заданая константа, напр 0.01)

    1. Вообще я редко, очень редко, неимоверно редко сталкивался с подобными задачами.

      На тестируемых сайтах цены всегда однозначно и однотипно отображаются, поэтому не приходится извращаться “А если будет с запятой, а если будет с точкой”. Всегда или одно, или другое.

  2. Я имел в виду задачу, где отображение на UI “всегда однозначно и однотипно” идет в десятичных дробях (3.33), а проверить надо, сверив с числом, которое надо еще и вычислить с помощью деления (10 / 3). Пример – калькулятор кредита для покупателя.

    Извините, если что-то не то говорю 🙂

  3. Алексей, а если сравнивать даты? есть два инпут поля с календарями. Оттуда я беру значение в виде 24/01/2012.
    Мои попытки сравнить их как storedVars[‘start’] < storedVars['end'] не увенчались успехом. Т.к. если конечная дата будет в следующем месяце 01/02/2012, то будет false.
    Также пробовал парсить как Date.parse(storedVars['start']) и сравнивать, но тот же результат… В каком направлении двигаться?

    1. Как я понимаю задача розпарсить стрингу даты и преобразовать ее, чтоб потом скормить в формат пригодный для Date.parse (у вас месяц второй, а нужно использовать месяц первый). Можно попробовать что то такое:

      var start = “24/01/2012”;
      var end = “01/02/2012”;

      var newStart = Date.parse(start.substring(3,5) + “/” + start.substring(0,2) + “/” + start.substring(6,10));
      var newEnd = Date.parse(end.substring(3,5) + “/” + end.substring(0,2) + “/” + end.substring(6,10));

      тогда:
      newStart = 1327356000000
      newEnd = 1328047200000

      и можно использовать условие if(newStart > newEnd)
      Только что у меня на Firefox сработоло без проблем 🙂

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s