#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
);
Комментарии:
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);
Упс.. Вы захотите по-прежнему использовать 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);