2012-01-02 2 views
4

Я пытаюсь выполнить базовую операцию: проверить, является ли строка числом.

Это не работает:

$qty = $_REQUEST[qty]; 
if (is_int($qty) == FALSE) { 
    echo "error"; 
} else { 
    echo "ok"; 
} 

Это один делает:

$qty = 1; 
if (is_int($qty) == FALSE) { 
    echo "error"; 
} else { 
    echo "ok"; 
} 

$_REQUEST[qty] размещена с запросом AJAX ($.post). $_REQUEST[qty] НЕ является пустым и содержит только число (1).

is_numeric() не будет работать, так как он обрабатывает 1e4 как номер.

+1

Вы имеете в виду '$ qty = $ _REQUEST ['qty']' (с кавычками) ...? – evotopid

+0

Не имеет значения. Всегда работает с кавычками или без них в любом скрипте. –

+0

@Radio да, он работает, но также вызывает ошибку уровня «NOTICE» (_PHP Notice: использование неопределенной константы foo - предполагается «foo'_»). Опуская цитаты, PHP предполагает, что вы имеете в виду то же самое с кавычками. В тот раз, когда вы на самом деле имеете константу, определенную с тем же именем, вы будете тянуть волосы в течение долгого времени, прежде чем поймать ее. Всегда используйте кавычки. –

ответ

6

is_int вернет true только в том случае, если переменная имеет целочисленный тип. если вы пытаетесь проверить, если переменная содержит строку, которая представляет собой число, использование:

is_numeric("1"); 

Источник: http://php.net/manual/en/function.is-int.php

EDIT:

использование ctype_digit() для проверки каждый символ в строке, если это число, чтобы исключить «1e4»

+0

Как я уже сказал, is_numeric() не идя на работу, видишь причину. –

+1

OP специально упоминает, что 'is_numeric()' не является для него решением, так как он также принимает научные обозначения и числа с плавающей запятой ... – codeling

+0

Также может быть способ сделать это через Regex. Я сосать в регулярном выражении, но это может иметь ответ: http://davidwalsh.name/php-validatie-numeric-digits – Rodik

2

попробуйте «is_numeric()» вместо «is_int» ...

Я думаю, что u r получает строку из вашего запроса ... и is_int действительно проверяет, имеет ли данный объект целое число ... Но это не -> это строка.

is_numeric просто проверяет, может ли объект преобразовываться в целое число. Если это так, то возвращает истину, в противном случае ложь ...

$qty = $_REQUEST[qty]; 
if (is_numeric($qty) == FALSE) { 
    echo "error"; 
} else { 
    echo "ok"; 
} 

PS: Использование $ _POST [] или $ _GET [] insetead из $ _REQUEST [];)

+0

is_numeric() обрабатывает значения типа «1e4» как ИСТИНА. Я должен проверить только числа. http://www.php.net/manual/en/function.is-numeric.php –

4

Если вы хотите проверить для наличие цифр только, вы можете использовать ctype_digit.

2

Вы упомянули, что вы не можете использовать is_numeric, потому что он относится к числу 1e4. Ну, 1e4 - это номер. В частности, 1 * 10^4.

Вы можете использовать is_int(intval($_REQUEST['qty'])), но так как intval всегда возвращает int (0 при сбое или пустой ввод), вы рискуете ложными срабатываниями. Однако в сочетании с is_numeric или filter_var вы должны быть на довольно твердой почве.

+0

Вы должны шутить? Нет PHP-оператора, чтобы узнать, является ли строка числом? =)) –

+0

@Radio, если вы имеете в виду строку _a, состоящую исключительно из цифр, ответ - 'ctype_digit', как @Srisa упоминает в своем ответе или регулярное выражение. –

2

Делают not-identical comparison­Docs, используя строку и целое бросание:

if ($qty !== (string)(int)$qty) { 
    echo "error"; 
} else { 
    echo "ok"; 
} 

В основном это буквальный: Поскольку все входящие переменные строки, вы не можете проверить их представляет собой целое число, если не отбрасывать их в целое число, а затем обратно в строку.Заверните его в функцию, если это тяжело понять в встроенном коде, что он делает:

/** 
* string is integer value? 
* 
* @return bool 
*/ 
function is_int_string($string) 
{ 
    return $string === (string)(int)$string; 
} 

$qty = $_REQUEST[qty]; 
if (is_int_string($qty) == FALSE) { 
    echo "error"; 
} else { 
    echo "ok"; 
} 

HTTP представляет собой текстовый протокол, так что есть только строка в самом начале.

+0

(int) $ qty будет обрабатывать любой альфа-символ как INT. Не работает. –

+0

@Radion: Теперь я понял, что вы имеете в виду, я слегка отредактировал ответ, чтобы разобраться с этим, это тот же принцип, актерский состав и сравнение. – hakre

+0

Звучит как решение, но не так просто, как мое: if (! Preg_match ("/^[0-9] + $ /", $ _REQUEST [qty])) {} –

2

На самом деле, все $ _REQUEST (а также $ _GET, $ _POST и т. Д.) Значения всегда строки.

Когда $qty is $_REQUEST[qty] это строка, а не целое число. Когда $qty равно 1, это уже целое число.

Используйте функцию intval, чтобы преобразовать ее в целое число. Но, как вы говорите, вы только хотите, чтобы выяснить, является ли это число или нет, поэтому использовать floatval преобразовать его, а затем проверить, если они равны:

if (intval($qty) == floatval($qty)) { 
    echo "Ok!"; 
} else { 
    echo "error"; 
} 
0

Я решил пойти с preg_match().

if (!preg_match("/^[0-9]+$/", $_REQUEST[qty])) {}