is_numeric, intval, ctype__digit .. можете ли вы на них положиться?
или мне нужно использовать регулярное выражение?
функция isNum ($ str) {
return (preg_match ("/ ^ [0-9] + $ /", $ str));
}
Ребята, что вы думаете? я тупой?
is_numeric, intval и ctype_digit – все это очень разные вещи.
is_numeric скажет вам, является ли содержимое переменной числовым (т.е. true, если это значение с плавающей точкой или целое число).
intval пытается преобразовать строку чисел в целое значение
ctype_digit скажет вам, содержит ли строка только числовые символы (будет выполнять ту же проверку, что и функция isNum).
лучший подход – это проверить, истинно ли is_numeric, а затем использовать что-то вдоль строк settype ($ myvalue, 'integer') или intval ($ myvalue);
Важным отличием между ctype_digit
и is_numerict
является отрицательное значение и число с плавающей точкой.
is_numeric(-10)
вернет true
тогда как 'ctype_digit (-10)' будет false
также ctype_digit(12.50)
вернет false
тогда как is_numeric(12.50)
будет true
Поэтому оба они удобны, зависит от контекста вашей логики домена.
Вы назвали два вида функций:
Валидатор проверяет, имеет ли данное значение заданные характеристики и возвращает либо true, либо false .
is_numeric
, функции ctype_*
и ваша функция isNum
проверяют функции, поскольку они просто говорят вам, является ли значение действительным или нет.
Фильтр изменяет заданное значение таким образом, что новое значение имеет заданные характеристики и, следовательно, будет действительным .
intval
и функции filter_*
функции фильтрации, так как они всегда возвращают допустимые значения, которые передают валидатор.
Вы также можете использовать новые функции фильтра .
if (!$var = filter_var($var, FILTER_VALIDATE_INT)) { die('Not an int!'); } echo "Var has the value $var.\n";
Лучше всего использовать при фильтрации входных данных от кли, веб-клиента и т. Д. Список фильтров здесь .
Я не эксперт по PHP, но вы подумали о написании модульного теста, управляемого данными, чтобы получить конкретное понимание этих функций. Если вы не уверены в своей надежности, и документация неясна, то ничто не сравнится с единичным тестом, который может тестировать 1000 перестановок и их ожидаемый результат.
Вам действительно даже не нужно заходить так далеко, как я себе представляю, что вы хотите протестировать только некоторые особые случаи. Ваши навыки программирования и компилятор – ваш лучший друг здесь. Программа, которую вы пишете, либо подтвердит, либо опровергнет ваши подозрения.
Кроме того, чтобы бросить бонус, вы можете следить за тем, сколько времени занимает каждый метод, и посмотреть, какая из них более эффективна.
Просто мысль.
Я не уверен, почему вы не просто используете intval. Ваше регулярное выражение даже не учитывает отрицательные числа, в конце концов, в то время как intval (хотя, возможно, это то, что вы собираетесь делать?).
Или даже просто литье в int, что позволяет избежать некоторых эзотерических чисел с плавающей запятой «gotchas», которые могут подкрасться с помощью intval.
Следуйте за документами. is_numeric
всегда будет доступен и просто проверяет, что у вас есть строка, которая может считаться номером PHP. Функции ctype_*
немного более узкие, но всегда должны быть доступны.
RegEx – это ИМО, перехитрить для таких проверок.