php сравнить числа с плавающей запятой со значением поля ввода

У меня есть форма, в которой пользователи могут вводить значения с плавающей запятой. Я отправляю эти значения в php-скрипт и сравниваю, находятся ли числа, введенные пользователями, между некоторыми значениями. Если я отправляю целое число, сравнение возвращает true независимо от того, превысило ли число границы. Если я ввожу число с плавающей запятой, сравнение завершается ошибкой, независимо от того, находится ли число в пределах границ. Я не дурак, я делал сравнения с плавающей запятой в С++, и я знаю, как сделать if(float1 >= float2) return false...

вот мой код:

//loading the helper
$val = Loader::helper('synerciel_form','synerciel_client');
//adding the fields to the inputs array for validation
$val->between('isolation_des_murs_peripheriques', 2.8, null, t($between.'Isolation des murs 
pèriphèriques'), true, false);

//вспомогательный класс

class SynercielFormHelper extends ValidationFormHelper {
    const VALID_BETWEEN = 7;
    const VALID_FLOAT = 7;
    private $min;
    private $max;
    private $includeLow;
    private $includeHigh;

 public function between($field, $min, $max, $errorMsg, $includeLow = true, $includeHigh = true) {
        $const = SynercielFormHelper::VALID_BETWEEN;
        $this->min = $min;
        $this->max = $max;
        $this->includeLow = $includeLow;
        $this->includeHigh = $includeHigh;

        $this->addRequired($field, $errorMsg, $const);
    }
   ...
   public function test() {

    $between = new ValidationNumbersBetweenHelper();
    if (!$between->between($this->data[$field], $this->min, $this->max, $this->includeLow, $this->includeHigh)) {
                        $this->fieldsInvalid[] = $f;
}

}

Мой метод проверки (я считаю, что здесь сложная часть)

class ValidationNumbersBetweenHelper {

    public function between($data, $min = null, $max = null, $includeLow = true, $includeHigh = true) {

        if ($min && $includeLow) {
            if (!($data >= $min))
                return false;
        } else if ($min) {
            if (!($data > $min))
                return false;
        }
        if ($max && $includeHigh) {
            if (!($data <= $max))
                return false;
        } else if ($max) {
            if (!($data < $max))
                return false;
        }
        return true;
    }

}

person user253530    schedule 13.05.2011    source источник
comment
2 предыдущих фрагмента кода были добавлены только для того, чтобы вы могли понять, где я храню переменные и общий поток вызовов... я считаю, что последний фрагмент кода - это тот, который вас должен заинтересовать   -  person user253530    schedule 14.05.2011


Ответы (2)


Проверьте предупреждающее сообщение http://php.net/manual/en/language.operators.comparison.php

Вы можете использовать математические функции BC http://php.net/manual/en/function.bccomp.php

$status = bccomp($left, $right);
if ($status == 0) {
    echo 'equal';
} else if ($status > 0) {
    echo 'left bigger than right';
} else {
   echo 'right bigger than left';
}

Надеюсь это поможет

person satrun77    schedule 07.06.2011

Попробуйте изолировать проблемный код. Поместите свою функцию проверки в отдельный PHP-файл и протестируйте ее там. Попробуйте проверить $max и $min на наличие !== null, так как 0 также является false. Вы можете изменить логику и удалить все !. (например, измените >= на <), поэтому вместо «не больше или равно» вы можете иметь «меньше чем»

person CJ Dennis    schedule 24.07.2012