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

#php #mysql #sql #pdo #decimal

#php

Вопрос:

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

Ввод: 100.25

Вывод: 10025

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

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

1. На этот вопрос уже был дан ответ. Документация — это типы фильтров . К сожалению, это не очень интуитивно понятно. В этой ситуации необходимо использовать как фильтр очистки, так и дополнительный флаг фильтра (который отсутствует в post). отсутствует в 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. : D

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

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

Ответ №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 so, чтобы протестировать его в 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);