невозможно определить, является ли строка целым числом или нет - PullRequest
2 голосов
/ 29 февраля 2012

Следующая функция свела меня с ума. Как же 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 сразу же, но ... Мне все еще очень любопытно выяснить, почему php считает, что 100x = 100 равны.

Ответы [ 4 ]

2 голосов
/ 29 февраля 2012

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

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


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

1 голос
/ 29 февраля 2012

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

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

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

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

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

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

1 голос
/ 29 февраля 2012

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

if ($orgval===$num) {

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

Документация: операторы сравнения

0 голосов
/ 29 февраля 2012

Либо приведите его к int, либо попробуйте http://php.net/manual/en/function.ctype-digit.php. Вам также нужно === в вашем if.

...