is_numeric, intval, ctype__digit .. можете ли вы положиться на них? - PullRequest
5 голосов
/ 20 января 2009

is_numeric, intval, ctype__digit .. Вы можете на них положиться?

или я должен использовать регулярные выражения?

function isNum($str) {<br>
    return (preg_match("/^[0-9]+$/", $str));
<br>}

что вы, ребята, думаете? я тупой?

Ответы [ 7 ]

11 голосов
/ 20 января 2009

is_numeric, intval и ctype_digit делают совершенно разные вещи.

is_numeric сообщит вам, является ли содержимое переменной числовым (т.е. истинным, если это значение с плавающей запятой или целое число).

intval пытается преобразовать строку чисел в целочисленное значение

ctype_digit сообщит вам, содержит ли строка только числовые символы (выполнит ту же проверку, что и ваша функция isNum).

лучший подход, вероятно, состоит в том, чтобы проверить, является ли is_numeric истинным, а затем использовать что-то по типу settype ($ myvalue, 'integer') или intval ($ myvalue);

10 голосов
/ 02 октября 2014

Одно важное различие между ctype_digit и is_numerict - это отрицательные значения и число с плавающей точкой.

is_numeric(-10) вернет true, тогда как 'ctype_digit (-10)' будет false

также ctype_digit(12.50) вернет false, тогда как is_numeric(12.50) будет true

Так что оба они пригодятся в зависимости от контекста логики вашего домена.

4 голосов
/ 20 января 2009

Вы назвали два вида функций:

A Validator проверяет, имеет ли данное значение заданные характеристики, и возвращает либо true , либо false .
is_numeric, функции ctype_* и ваша функция isNum являются функциями проверки, поскольку они просто сообщают вам, является ли значение допустимым или нет.

A Фильтр изменяет заданное значение таким образом, что новое значение имеет заданные характеристики и, таким образом, будет действительным .
intval и функции filter_* являются функциями фильтрации, поскольку они всегда будут возвращать допустимые значения, которые будут проходить валидатор.

1 голос
/ 21 января 2009

Следуйте документам. is_numeric всегда будет доступен и просто подтверждает, что у вас есть строка, которую PHP может считать числом. Функции ctype_* немного более узки по объему, но также всегда должны быть доступны.

RegEx, IMO, избыточен для таких проверок.

1 голос
/ 20 января 2009

Вы также можете использовать новые функции фильтра .

if (!$var = filter_var($var, FILTER_VALIDATE_INT)) {
  die('Not an int!');
}

echo "Var has the value $var.\n";

Лучше всего использовать при фильтрации ввода из cli, веб-клиента и т. Д. Список фильтров здесь .

0 голосов
/ 20 января 2009

Я не уверен, почему бы вам просто не использовать intval. В конце концов, ваше регулярное выражение даже не учитывает отрицательные числа, в то время как intval будет (хотя, возможно, это то, что вы собираетесь?).

Или даже просто приведение к int, что позволяет избежать некоторых эзотерических «ловушек» с плавающей точкой, которые могут подкрасться к intval.

0 голосов
/ 20 января 2009

Я не эксперт по PHP, но вы рассматривали возможность написания модульного теста, управляемого данными, чтобы получить конкретное представление об этих функциях. Если вы не уверены в их надежности, а документация неясна, то ничто не сравнится с модульным тестом, который может проверить тысячи перестановок и их ожидаемый результат.

Тебе даже не нужно заходить так далеко, как я представляю, что тебе нужно протестировать только некоторые особые крайние случаи. Ваши навыки программирования и компилятор - ваш лучший друг здесь. Программа, которую вы пишете, подтвердит или опровергнет ваши подозрения.

Кроме того, чтобы добавить бонус, вы можете отслеживать, сколько времени занимает каждый метод, и видеть, какой из них более эффективен.

Просто мысль.

...