193 votes

Comment vérifier qu'une chaîne est un int, mais pas un double, etc.?

PHP a un intval() fonction qui vous permet de convertir une chaîne en entier. Cependant, je veux vérifier que la chaîne est un nombre entier à l'avance, afin que je puisse donner un message d'erreur à l'utilisateur s'il est mauvais. PHP a is_int(), mais qui renvoie la valeur false pour la chaîne "2".

PHP a l' is_numeric() de la fonction, mais qui renvoie true si le nombre est un double. Je veux quelque chose qui va retourner false pour un double, mais c'est vrai pour un entier (int).

par exemple:

my_is_int("2") == TRUE
my_is_int("2.1") == FALSE

222voto

Dominic Rodger Points 44489

Comment sur l'utilisation d' ctype_digit?

Dans le manuel:

<?php
$strings = array('1820.20', '10002', 'wsl!12');
foreach ($strings as $testcase) {
    if (ctype_digit($testcase)) {
        echo "The string $testcase consists of all digits.\n";
    } else {
        echo "The string $testcase does not consist of all digits.\n";
    }
}
?>

L'exemple ci-dessus va afficher:

La chaîne 1820.20 ne consiste pas tous les chiffres.
La chaîne 10002 se compose de tous les chiffres.
La chaîne wsl!12 ne consiste pas tous les chiffres.

Cela ne fonctionnera que si votre entrée est toujours une chaîne de caractères:

$numeric_string = '42';
$integer        = 42;

ctype_digit($numeric_string);  // true
ctype_digit($integer);         // false

Si votre contribution peut être de type int, puis de les combiner ctype_digit avec is_int.

Si vous vous souciez de nombres négatifs, alors vous aurez besoin de vérifier l'entrée d'une précédente -, et si oui, appelez - ctype_digit sur substr de la chaîne d'entrée. Quelque chose comme ce serait le faire:

function my_is_int($input) {
  if ($input[0] == '-') {
    return ctype_digit(substr($input, 1));
  }
  return ctype_digit($input);
}

124voto

Gordon Points 156415

filter_var devrait le faire:

 var_dump(filter_var('2', FILTER_VALIDATE_INT));   // 2
var_dump(filter_var('2.0', FILTER_VALIDATE_INT)); // false
var_dump(filter_var('2.1', FILTER_VALIDATE_INT)); // false
 

mais

 var_dump(filter_var(2, FILTER_VALIDATE_INT));     // 2
var_dump(filter_var(2.0, FILTER_VALIDATE_INT));   // 2
var_dump(filter_var(2.1, FILTER_VALIDATE_INT));   // false
 

Si vous voulez juste des valeurs booléennes comme valeurs de retour, intégrez-les dans une fonction, par exemple

 function validatesAsInt($number)
{
    $number = filter_var($number, FILTER_VALIDATE_INT);
    return ($number !== FALSE);
}
 

19voto

nickf Points 185423

+1 à la réponse de Dominic (en utilisant ctype_digit ). Une autre façon de le faire est d'utiliser la contrainte de type:

 $inty = "2";
$inty2 = " 2";
$floaty = "2.1";
$floaty2 = "2.0";

is_int($inty + 0); // true
is_int($floaty + 0); // false
is_int($floaty2 + 0); // false

// here's difference between this and the ctype functions.
is_int($inty2 + 0);  // true
ctype_digit($inty2); // false
 

13voto

greg Points 492

Jeter à int. s'il a toujours la même valeur, son int;

 function my_is_int($var) {
  $tmp = (int) $var;
  if($tmp == $var)
       return true;
  else
       return false;
}
 

8voto

GmonC Points 8978
 /**
 * Check if a number is a counting number by checking if it
 * is an integer primitive type, or if the string represents
 * an integer as a string
 */
function is_int_val($data) {
    if (is_int($data) === true) return true;
    elseif (is_string($data) === true && is_numeric($data) === true) {
        return (strpos($data, '.') === false);
    } 
    return false;
}
 

Source

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