2012-02-29 10 views
2

Следующий funciton загнал меня в орехи. Как на земле 100x может быть равно 100, а затем 100x сообщается как целое число?
Для жизни меня я не могу понять. Вы можете скопировать и вставить все это и посмотреть его сами.
Мне не хватает простой точки где-то здесь, помогите мне с парнями.не может определить, является ли строка в настоящее время целым числом или нет.

function blp_int($val) { 
    $orgval = $val; 
    $num = (int)$val;  
    echo "<li><font color=red>val: ". $val . " is being checked to see if it's an integer or not"; 
    echo "<li><font color=red>orgval: ". $orgval ; 
    echo "<li><font color=red>num: ". $num ; 
    if ($orgval==$num) { 
     echo "<li><font color=red><b>YES IT IS! the [{$orgval}] is equal to [{$num}]</b>"; 
     return true; 
    } 
    return false; 
} 

if (blp_int("100")) 
{ 
    echo "<h1>100 is an integer!</h1>"; 
} 
else 
{ 
    echo "<h1>100 is NOT an integer!</h1>"; 
} 

if (blp_int("100x")) 
{ 
    echo "<h1>100x is an integer!</h1>"; 
} 
else 
{ 
    echo "<h1>100x is NOT an integer!</h1>"; 
} 

приведенный выше код при запуске возвращает следующее:

val: 100 is being checked to see if it's an integer or not 
orgval: 100 
num: 100 
YES IT IS. the [100] is equal to [100] 
100 is an integer! 

val: 100x is being checked to see if it's an integer or not 
orgval: 100x 
num: 100 
YES IT IS. the [100x] is equal to [100] 
100x is an integer! 

я могу исправить ситуацию, добавив следующие биты

if (!is_numeric($val)) 
    { 
     return false; 
    } 

к верхней части функции blp_int сразу же, но .. Я все еще очень интересно узнать, почему на earth php считает 100x = 100 равными.

+0

'is_int',' ctype_digit', 'filter_var ($ string, FILTER_VALIDATE_INT)', последний может запретить/разрешить hex и восьмеричные ints, если вы хотите. Если вы хотите использовать свой код, case to int, но затем вернитесь к строке: 'if ((string) $ orgval == (string) (int) $ orgval)' – Wrikken

+0

Ваша функция использует 'echo' и' return', попробуйте не писать функцию таким образом. какой результат?Я имею в виду то, что вы видите на экране, когда 'echo' переменные перед int casting и после? –

ответ

2

Как вы можете видеть в this example, литье 100x, как целое преобразует его в 100. Поскольку вы не используете строгое сравнение, '100x' == 100 это правда. PHP удаляет из него x, чтобы сделать только 100.

Вы можете использовать строгое сравнение (которое также сравнивает типы), так что '100x' === 100 вернет false. Используя его, всякий раз, когда строка сравнивалась с целым числом, она возвращает false.


По вашему редактирования:is_numeric не может быть наиболее надежным, поскольку он возвращает истину для чисел, отформатированных в виде строки, например '100'. Если вы хотите, чтобы число было целым числом (и никогда не было строкой), вместо этого вы могли бы использовать is_integer. Я не совсем уверен, что именно вы делаете, но я думал, что добавлю эту заметку.

+0

Кроме того, '' 100 '=== 100' также является ложным. – Wrikken

+0

Каков наилучший способ написать функцию (возможно, назовите ее is_this_integer ($ v) "), которая возвращает true, когда $ V, переданный ей * кажется *, является целым числом невооруженным глазом? поэтому не только 1 или -1, но также строки, такие как «1» или «1» или «-1» или «-1», все вернутся true, и, разумеется, 100x или «100x» не будут возвращаться как целое. –

1

Я думаю, вы должны использовать три равные знаки в вашем IF:

if ($orgval===$num) { 

В противном случае PHP отбрасывает значение 100x к 100 и 100=100.

Documentation: Comparison Operators

+0

Downvoter: Комментарий, пожалуйста! – ComFreek

1

Какую проверку вы хотите сделать? Есть несколько способов, которыми вы могли бы это сделать:

if (preg_match('!^[0-9]+$!', $input)) 

if (intval($input) == $input) 

if (intval($input) === $input) 

if ('x'.intval($input) === 'x'.$input) 

Это зависит от того, насколько тщательно вы хотите проверить, является ли это целым числом. Имеет ли значение, если вам нужно сначала trim()?

 Смежные вопросы

  • Нет связанных вопросов^_^