Почему константа `FILTER_VALIDATE_NUMBER_FLOAT` удаляет символ десятичного знака?

#php

#php

Вопрос:

 $quantity = filter_input(INPUT_GET, 'quantity', FILTER_SANITIZE_NUMBER_FLOAT);
  

Ввод: 100.25

Вывод: 10025

Как я могу сохранить . символ?

Комментарии:

1. На этот вопрос уже был дан ответ. Документация посвящена типам фильтров . К сожалению, это не очень интуитивно понятно. В этой ситуации необходимо использовать как фильтр очистки, так и дополнительный флаг фильтра (который отсутствует в post).

2. (Кроме того, опубликованный код не умножается на 100: он удаляет «оскорбительный» десятичный знак, попробуйте «100.1234» в качестве входных данных 🙂

Ответ №1:

Попробуйте это…

 $quantity = filter_input(
              INPUT_GET, 
              'quantity', 
              FILTER_SANITIZE_NUMBER_FLOAT, 
              FILTER_FLAG_ALLOW_FRACTION
            );
  

CodePad.

Комментарии:

1. Я не понимаю смысла этого фильтра без FILTER_FLAG_ALLOW_FRACTION — Конечно, само определение «float» заключается в том, что оно имеет «плавающую» точку, т. е. десятичную?

2. @Andy Я думаю, причина в … PHP. 😀

3. Я думаю, вы правы, я несколько раз ломал голову над другими странностями PHP с тех пор, как написал этот комментарий P.S: Шрифт вашего сайта напоминает мне старые школьные игры типа «укажи и щелкни» 🙂

4. @Andy В то время я был одержим эмуляторами. 😀

Ответ №2:

Чтение документации http://www.php.net/manual/en/filter.filters.sanitize.php показывает, что FILTER_SANITIZE_NUMBER_FLOAT это приводит к следующему эффекту:

Удалите все символы, кроме цифр, — и необязательно .,eE.

Переворачивая это довольно плохо сформированное предложение:

Это удаляет все символы из входных данных, кроме цифр (0-9). С необязательными флагами можно также разрешить символы . (точка), (запятая) e (показатель степени) и E (экспонента)

Итак, ваш пример кода не умножается, но он удаляет десятичную точку.

Решение:

Вам нужно установить опцию FILTER_FLAG_ALLOW_FRACTION в вызове вашей функции, чтобы разрешить десятичную точку:

 $quantity = filter_input(INPUT_GET, 'quantity', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
  

Ответ №3:

Вы хотите:

 $quantity = filter_var(100.25, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);

print_r($quantity);
  

http://codepad.org/ch66qJru

Упс.. Вы захотите по-прежнему использовать filter_input то, что у вас есть в данный момент, а также те же первые два аргумента. В итоге я использовал filter_var , чтобы протестировать его в codepad, и забыл изменить его обратно: P

Ответ №4:

В качестве альтернативы используйте FILTER_VALIDATE_FLOAT , с кратким примечанием к обратной связи, если оно не соответствует:

     $quantity = (filter_input(INPUT_GET, 'quantity', FILTER_VALIDATE_FLOAT))
                ?filter_input(INPUT_GET, 'quantity', FILTER_VALIDATE_FLOAT):
                "Invalid Decimal Number";

    print_r($quantity);