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 !

6voto

Anthony Points 14424

Si vous savez qu'il s'agira d'un nombre (ce qui signifie qu'il ne s'agira jamais d'un nombre entier converti en chaîne de caractères, par exemple "ten" o "100" vous pouvez simplement utiliser is_int() :

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

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

6voto

J'ai testé toutes les solutions proposées avec de nombreuses valeurs problématiques mentionnées, elles échouent toutes pour au moins un des cas de test. Commencez à vérifier si $value est un nombre utilisant is_numeric($value) réduit le nombre d'échecs pour de nombreuses solutions, mais ne transforme aucune solution en solution ultime :

$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's solution fails for "10.00"
    // return (ctype_digit((string) $value));

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

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

    // @ MartyIX's 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's answer

    // @joseph4tw's 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's solution fails for "10.00"
    // return (is_numeric($value) && is_int($value));

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

    // @Notinlist's 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";
}

Je pense que les solutions comme celles proposées par @Aistina et @Notinlist sont les meilleures, car elles utilisent un seuil d'erreur pour décider si une valeur est un nombre entier. Il est important de noter qu'elles ont fonctionné comme prévu pour l'expression (-(4.42-5))/0.29 alors que tous les autres ont échoué dans ce cas de test.

J'ai décidé d'utiliser la solution de @Notinlist en raison de sa lisibilité :

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

J'ai besoin de tester si les valeurs sont des nombres entiers, des devises ou des pourcentages, je pense que 2 chiffres de précision sont suffisants, donc la solution de @Notinlist répond à mes besoins.

Je lance ce test :

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

Produit la sortie suivante :

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

3voto

Notinlist Points 3060
if(floor($number) == $number)

N'est pas un algorithme stable. Quand une valeur est mathématiquement 1.0, la valeur numérique peut être 0.9999999. Si vous appliquez floor() sur cette valeur, vous obtiendrez 0, ce qui n'est pas égal à 0,9999999.

Vous devez deviner un rayon de précision, par exemple 3 chiffres.

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

3voto

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

EX :

2.0000000000001 | fraction

2.1 | fraction

2.00 | entier

2 | entiers

3voto

Zankar Points 170

Une autre méthode que j'ai trouvée est ceil($value) === floor($value) . Si un nombre est un nombre entier, cela devrait toujours être vrai, même si l'on compare 10 avec 10.000 et cela fonctionne même avec des nombres exprimés en chaîne, par exemple ceil("10.0") === floor(10) .

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