43 votes

PHP vérifie si la variable est un nombre entier

J'ai ce code PHP :

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

Ce que je veux savoir, c'est comment vérifier si $entityElementCount est un nombre entier (2, 6, ...) ou partiel (2,33, 6,2, ...).

Merci !

2voto

Artron Points 31
(string)floor($pecahformat[3])!=(string)$pecahformat[3]

1voto

jyavenard Points 151
floor($entityElementCount) == $entityElementCount

C'est vrai si c'est un nombre entier.

1voto

danielson317 Points 665

Il ne s'agit pas tant d'une tentative de réponse à cette question. Il y a déjà beaucoup de réponses. Si vous faites des statistiques comme le suggère la question, je pense que la réponse de @antonio-vinicius-menezes-medei vous conviendra mieux. Cependant, j'avais besoin de cette réponse pour la validation des entrées. J'ai trouvé cette vérification plus fiable pour valider une chaîne d'entrée est un nombre entier :

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

L'option "is_numeric" corrige simplement la conversion de "true" en "1" dans preg_match.

En jouant sur la réponse de @antonio-vinicius-menezes-medei. J'ai écrit un script pour tester ceci ci-dessous. Notez que le ini_set('precision', 20) . preg_match convertira l'argument en une chaîne de caractères. Si votre précision est inférieure à la longueur des valeurs flottantes, elles seront simplement arrondies à la précision donnée. Similaire à la réponse de @antonio-vinicius-menezes-medei, ce paramètre de précision forcera une longueur d'estimation similaire.

  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';
  }

Ce qui produit cette sortie :

float(0.28999999999999998002) Non
int(2) Oui
int(6) Oui
float(2.3300000000000000711) Non
float(6.2000000000000001776) Non
string(5) "10.00" Non
float(1.3999999999999999112) Non
int(10) Oui
string(2) "10" Oui
float(10.5) Non
string(5) "0x539" Non
bool(true) Non
bool(false) Non
int(83) Oui
float(9.4000000000000003553) Non
string(3) "dix" Non
string(3) "100" Oui
int(1) Oui
float(0.99999999699999997382) Non
int(0) Oui
float(0.00010000000000000000479) Non
float(1) Oui
float(0.99999990000000005264) Non
float(2.0000000000000004441) Non

1voto

The Vojtisek Points 354

Juste pour partager ma solution avec la chaîne/le nombre localisé, cette combinaison a fonctionné comme un charme pour moi.

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;
}

1voto

hanshenrik Points 192

Version améliorée de la solution de @Tyler Carter, qui gère mieux les cas limites que l'original :

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

(le code de Tyler ne reconnaît pas que la chaîne "123foobar" n'est pas un nombre entier. cette version améliorée ne fera pas cette erreur. crédits à @Shafizadeh dans les commentaires pour avoir découvert le bogue. aussi c'est php7 strict_types=1 -compatible)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X