Подтвердить что ты не робот

PHP проверяет, является ли переменная целым числом

У меня есть этот код PHP:

$entityElementCount = (-($highScore-$totalKeywordCount))/0.29;

Я хочу знать, как проверить, является ли $entityElementCount целое число (2, 6,...) или частичное (2.33, 6.2,...).

Спасибо!

4b9b3361

Ответ 1

$entityElementCount = (-($highScore-$totalKeywordCount))/0.29;
if (ctype_digit($entityElementCount) ){
    // (ctype_digit((string)$entityElementCount))  // as advised.
    print "whole number\n";
}else{
    print "not whole number\n";
}

Ответ 2

if (floor($number) == $number)

Ответ 3

Я знаю, что это старый, но я думал, что поделюсь чем-то, что я только что нашел:

Используйте fmod и проверьте на 0

$entityElementCount = (-($highScore-$totalKeywordCount))/0.29;
if (fmod($entityElementCount,1) !== 0.0) {
    echo 'Not a whole number!';
} else {
    echo 'A whole number!';
}

fmod отличается от%, потому что если у вас есть дробь,%, кажется, не работает для меня (он возвращает 0... например, echo 9.4 % 1; будет выводить 0). С fmod вы получите дробную часть. Например:

echo fmod(9.4, 1);

Будет выводить 0.4

Ответ 4

Я бы использовал intval, как это:

if($number === intval($number)) {

}

Тесты:

var_dump(10 === intval(10));     // prints "bool(true)"
var_dump("10" === intval("10")); // prints "bool(false)"
var_dump(10.5 === intval(10.5)); // prints "bool(false)"
var_dump("0x539" === intval("0x539")); // prints "bool(false)"

Другие решения

1)

if(floor($number) == $number) {   // Currently most upvoted solution: 

Тесты:

$number = true;
var_dump(floor($number) == $number); // prints "bool(true)" which is incorrect.

2)

if (is_numeric($number) && floor($number) == $number) {

Угловой корпус:

$number = "0x539";
var_dump(is_numeric($number) && floor($number) == $number); // prints "bool(true)" which depend on context may or may not be what you want

3)

if (ctype_digit($number)) {

Тесты:

var_dump(ctype_digit("0x539")); // prints "bool(false)"
var_dump(ctype_digit(10)); // prints "bool(false)"
var_dump(ctype_digit(0x53)); // prints "bool(false)"

Ответ 5

Основной способ, как сказал Чача, -

if (floor($number) == $number)

Однако типы с плавающей запятой не могут точно хранить числа, а это означает, что 1 может быть сохранен как 0.999999997. Конечно, это означает, что вышеуказанная проверка завершится неудачно, потому что она будет округлена до 0, хотя для ваших целей достаточно близко до 1, чтобы считаться целым числом. Поэтому попробуйте что-то вроде этого:

if (abs($number - round($number)) < 0.0001)

Ответ 6

Если вы знаете, что он будет числовым (это означает, что он никогда не будет целым числом, отличным как строка, например "ten" или "100", вы можете просто использовать is_int():

$entityElementCount = (-($highScore-$totalKeywordCount))/0.29;
$entityWholeNumber = is_int($entityElementCount);

echo ($entityWholeNumber) ? "Whole Number!" : "Not a whole number!";

Ответ 7

Я тестировал все предлагаемые решения со многими упомянутыми проблемными значениями, все они терпят неудачу, по крайней мере, для одного из тестовых случаев. Начните проверять, является ли $value число с помощью is_numeric($value) уменьшает количество отказов для многих решений, но не превращает какое-либо решение в конечное:

$test_cases = array(0.29, 2, 6, 2.33, 6.2, '10.00', 1.4, 10, "10", 10.5, "0x539", true,
    false, 0x53, 9.4, "ten", "100", 1, 0.999999997, 0, 0.0001, 1.0, 0.9999999,
    (-(4.42-5))/0.29);

function is_whole_number($value) {
    // Doing this prevents failing for values like true or "ten"
    if (!is_numeric($value)) {
        return false;
    }

    // @ghostdog74 solution fails for "10.00"
    // return (ctype_digit((string) $value));

    // Both @Maurice solutions fails for "10.00"
    // return ((string) $value === (string) (int) $value);
    // return is_int($value);

    // @j.hull solution always returns true for numeric values
    // return (abs($value) % 1 == 0 ? true : false);

    // @ MartyIX solution fails for "10.00"
    // return ($value === intval($value));

    // This one fails for (-(4.42-5))/0.29
    // return (floor($value) == $value);

    // This one fails for 2
    // return ctype_digit($value);

    // I didn't understand Josh Crozier answer

    // @joseph4tw solution fails for (-(4.42-5))/0.29
    // return !(fmod($value, 1) != 0);

    // If you are unsure about the double negation, doing this way produces the same
    // results:
    // return (fmod($value, 1) == 0);

    // Doing this way, it always returns false 
    // return (fmod($value, 1) === 0);

    // @Anthony solution fails for "10.00"
    // return (is_numeric($value) && is_int($value));

    // @Aistina solution fails for 0.999999997
    // return (abs($value - round($value)) < 0.0001);

    // @Notinlist solution fails for 0.999999997
    // return (round($value, 3) == round($value));
}

foreach ($test_cases as $test_case) {
    var_dump($test_case);
    echo ' is a whole number? ';
    echo is_whole_number($test_case) ? 'yes' : 'no';
    echo "\n";
}

Я думаю, что такие решения, как предложенные @Aistina и @Notinlist, являются лучшими, потому что они используют порог ошибки, чтобы определить, является ли значение целым числом. Важно отметить, что они работали как ожидалось для выражения (-(4.42-5))/0.29, в то время как все остальные потерпели неудачу в этом тестовом случае.

Я решил использовать решение @Notinlist из-за его читаемости:

function is_whole_number($value) {
    return (is_numeric($value) && (round($value, 3) == round($value)));
}

Мне нужно проверить, являются ли значения целыми числами, валютой или процентом, я думаю, что двух цифр точности достаточно, поэтому решение @Notinlist соответствует моим потребностям.

Запуск этого теста:

$test_cases = array(0.29, 2, 6, 2.33, 6.2, '10.00', 1.4, 10, "10", 10.5, "0x539", true,
    false, 0x53, 9.4, "ten", "100", 1, 0.999999997, 0, 0.0001, 1.0, 0.9999999,
    (-(4.42-5))/0.29);

function is_whole_number($value) {
    return (is_numeric($value) && (round($value, 3) == round($value)));
}

foreach ($test_cases as $test_case) {
    var_dump($test_case);
    echo ' is a whole number? ';
    echo is_whole_number($test_case) ? 'yes' : 'no';
    echo "\n";
}

Производит следующий вывод:

float(0.29)
 is a whole number? no
int(2)
 is a whole number? yes
int(6)
 is a whole number? yes
float(2.33)
 is a whole number? no
float(6.2)
 is a whole number? no
string(5) "10.00"
 is a whole number? yes
float(1.4)
 is a whole number? no
int(10)
 is a whole number? yes
string(2) "10"
 is a whole number? yes
float(10.5)
 is a whole number? no
string(5) "0x539"
 is a whole number? yes
bool(true)
 is a whole number? no
bool(false)
 is a whole number? no
int(83)
 is a whole number? yes
float(9.4)
 is a whole number? no
string(3) "ten"
 is a whole number? no
string(3) "100"
 is a whole number? yes
int(1)
 is a whole number? yes
float(0.999999997)
 is a whole number? yes
int(0)
 is a whole number? yes
float(0.0001)
 is a whole number? yes
float(1)
 is a whole number? yes
float(0.9999999)
 is a whole number? yes
float(2)
 is a whole number? yes

Ответ 8

if(floor($number) == $number)

Не является стабильным алгоритмом. Когда значение математически 1,0, числовое значение может быть 0.9999999. Если вы примените floor() на нем, это будет 0, что не равно 0.9999999.

Вы должны угадать прецизионный радиус, например, 3 цифры

if(round($number,3) == round($number))

Ответ 9

(string)floor($pecahformat[3])!=(string)$pecahformat[3]

Ответ 10

floor($entityElementCount) == $entityElementCount

Это будет true, если это целое число

Ответ 11

Это не попытка ответить на этот вопрос так много. Их уже много ответов. Если вы ведете статистику, как подразумевает вопрос, я подозреваю, что ответ @antonio-vinicius-menezes-medei подойдет вам лучше всего. Однако мне нужен этот ответ для проверки ввода. Я нашел эту проверку более надежной для проверки входной строки целого числа:

is_numeric($number) && preg_match('/^[0-9]+$/', $number)

"Is_numeric" просто исправляет "истинное" преобразование в "1" в preg_match.

Таким образом, разыгрывая ответ @antonio-vinicius-menezes-medei. Я написал скрипт для проверки этого ниже. Обратите внимание на ini_set('precision', 20). preg_match преобразует аргумент в строку. Если ваша точность установлена ниже длины значений с плавающей точкой, они будут просто округляться с заданной точностью. Подобно ответу @antonio-vinicius-menezes-medei, этот параметр точности приведет к аналогичной длине оценки.

  ini_set('precision', 20);
  $test_cases = array(0.29, 2, 6, 2.33, 6.2, '10.00', 1.4, 10, "10", 10.5, "0x539", true,
    false, 0x53, 9.4, "ten", "100", 1, 0.999999997, 0, 0.0001, 1.0, 0.9999999,
    (-(4.42-5))/0.29);

  foreach ($test_cases as $number)
  {
    echo '<strong>';
    var_dump($number);
    echo '</strong>';
    echo boolFormater(is_numeric($number) && preg_match('/^[0-9]+$/', $number));
    echo '<br>';
  }

  function boolFormater($value)
  {
    if ($value)
    {
      return 'Yes';
    }
    return 'No';
  }

Который производит этот вывод:

float (0.28999999999999998002) Нет
int (2) Да
int (6) Да
float (2.3300000000000000711) Нет
float (6.2000000000000001776) Нет
Строка (5) "10.00" Нет
float (1.3999999999999999112) Нет
int (10) Да
строка (2) "10" Да
поплавок (10,5) нет
строка (5) "0x539" Нет
бул (правда) нет
bool (false) нет
int (83) Да
float (9.4000000000000003553) Нет
Строка (3) "десять" Нет
Строка (3) "100" Да
int (1) Да
float (0.99999999699999997382) Нет
int (0) Да
float (0.00010000000000000000479) Нет
float (1) Да
float (0.99999990000000005264) Нет
float (2.0000000000000004441) Нет

Ответ 12

улучшенная версия решения @Tyler Carter, которая обрабатывает крайние случаи лучше, чем оригинал:

function is_whole_number($number){
    return (is_float(($f=filter_var($number,FILTER_VALIDATE_FLOAT))) && floor($f)===$f);    
}

(Код Тайлера не может распознать, что строка "123foobar" не является целым числом. Эта улучшенная версия не допустит этой ошибки. Авторы @Shafizadeh отмечают в комментариях за обнаружение ошибки. Также это php7 strict_types=1 -compatible )

Ответ 13

Кажется, что простой подход заключается в использовании модуля (%), чтобы определить, является ли значение целым или нет.

x = y % 1  

если y - любое другое, то целое число, результат не равен нулю (0). Тогда будет тест:

if (y % 1 == 0) { 
   // this is a whole number  
} else { 
   // this is not a whole number 
}

var isWhole = (y % 1 == 0? true: false);  // to get a boolean return. 

Предположим, что это будет отображать отрицательное число как целое число, а затем просто оберните ABS() вокруг y, чтобы всегда проверять положительное.

Ответ 14

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

if ((string) $var === (string) (int) $var) {
    echo 'whole number';
} else {
    echo 'whatever it is, it\ something else';
}

В вашем конкретном случае я бы использовал is_int()

if (is_int($var) {
    echo 'integer';
}

Ответ 15

Простое решение только для положительных целых чисел. Это может не работать для всего.

$string = '0x539';
$ceil = ceil($string);

if($ceil < 1){
  $ceil = FALSE; // or whatever you want i.e 0 or 1
}

echo $ceil; // 1337

При желании вы можете использовать floor() вместо ceil().

Ответ 16

function isInteger($value)
{
    // '1' + 0 == int, '1.2' + 0 == float, '1e2' == float
    return is_numeric($value) && is_int($value + 0);
}

function isWholeNumber($value)
{
    return is_numeric($value)
        && (is_int($value + 0)
            || (intval($value + 0) === intval(ceil($value + 0))));
}

Если вы хотите проверить как целые, так и десятичные числа, вы можете сделать следующее:

if (isInteger($foo))
{
    // integer as int or string
}
if (isWholeNumber($foo))
{
    // integer as int or string, or float/double with zero decimal part
}
else if (is_numeric($foo))
{
    // decimal number - still numeric, but not int
}

Это правильно проверит ваш номер, не округляя его, отбрасывая его на int (который в случае десятичного числа потеряет десятичную часть) или выполнит какую-либо математику. Если, однако, вы хотите рассматривать 1.00 как целое число, то это еще одна история.

Ответ 17

Я знаю, что это очень старый пост, но это простая функция, которая возвращает действительное целое число и приводит его к типу int. Возвращает false, если это не удалось.

function isWholeNumber($v)
{
    if ($v !='' && is_numeric($v) && strpos($v, '.') === false) {
        return (int)$v;
    }
    return false;
}

Использование:

$a = 43;
$b = 4.3;
$c = 'four_three';

isWholeNumber($a) // 43
isWholeNumber($b) // false
isWholeNumber($c) // false

Ответ 18

Просто чтобы поделиться своим решением с локализованной строкой/номером, эта комбо сработала для меня как очарование.

public static function isWholeNumber ($input, $decimalDelimiter = ',')
{
    if (is_string($input)){
        $input = str_replace($decimalDelimiter, '.', $input);
        $input = floatval($input);
    }

    if (fmod($input,1) !== 0.0) {
        return false;
    }

    return true;
}

Ответ 19

$entityElementCount = (-($highScore-$totalKeywordCount))/0.29;

Method 1-
    By using ctype_digit() function. 

    if ( ctype_digit($entityElementCount )) { 
        echo "Whole Number\n"; 
    } else { 
        echo "Not a whole Number\n"; 
    } 


Method 2-
    By using is_float() function. 

    if (is_float($entityElementCount )) { 
        echo "Not a Whole Number\n"; 
    } else { 
        echo "Whole Number\n"; 
    } 


Method 3-
    By using is_int() function. 

    if (is_int($entityElementCount )) { 
        echo "Whole Number\n"; 
    } else { 
        echo "Not a whole Number\n"; 
    } 


Method 5-
    By using fmod() function. 

    It needs 2 parameters one dividend and other is divisor
    Here $dividend=$entityElementCount and divisor=1
    if (fmod($dividend,$divisor) !== 0.0) {
        echo 'Not a whole number!';
    } else {
     echo 'A whole number!';
    }

there are some more function like intval(), floor(),... can be used to check it'enter code here'

Ответ 20

    $num = 2.0000000000001;
    if( $num == floor( $num  ) ){
        echo('whole');
    }else{
        echo('fraction');
    }

EX:

2.0000000000001 | фракция

2.1 | фракция

2,00 | вся

2 | все