41 votes

Vérifier si une chaîne contient un entier

Connaissez-vous une fonction qui peut vérifier si une chaîne contient un entier?

Voici comment je m'attendrais à ce que cela fonctionne:

 holds_int("23") // should return true.  
holds_int("2.3") // should return false.  
holds_int("qwe") // should return false.
 

73voto

Jhong Points 1750
 if((string)(int)$var == $var) {
    echo 'var is an integer or a string representation of an integer';
}
 

Exemples de résultats:

 var_dump( test(1)             ); // TRUE
var_dump( test('1')           ); // TRUE
var_dump( test('1.0')         ); // TRUE
var_dump( test('1.1')         ); // false
var_dump( test('0xFF')        ); // false
var_dump( test('0123')        ); // TRUE
var_dump( test('01090')       ); // TRUE
var_dump( test('-1000000')    ); // TRUE
var_dump( test('+1000000')    ); // TRUE
var_dump( test('2147483648')  ); // false
var_dump( test('-2147483649') ); // false
 

Voir la réponse de Gordon ci-dessous pour savoir comment cela se comporterait différemment si === étaient utilisés pour la comparaison au lieu de == .

14voto

Jack Points 88446

Pas la méthode la plus rapide, mais filter_var() est tout à fait exacte:

function test($s)
{
    return filter_var($s, FILTER_VALIDATE_INT) !== false;
}

Voici les résultats sur la base Jhong de réponse, des différences marquées avec !!:

var_dump(test(1)            ); // true
var_dump(test('1')          ); // true
var_dump(test('1.0')        ); // false !!
var_dump(test('1.1')        ); // false
var_dump(test('0xFF')       ); // false
var_dump(test('0123')       ); // false !!
var_dump(test('01090')      ); // false !!
var_dump(test('-1000000')   ); // true
var_dump(test('+1000000')   ); // true
var_dump(test('2147483648') ); // true !! on 64bit
var_dump(test('-2147483649')); // true !! on 64bit

Pour permettre octal entiers:

function test($s)
{
   return filter_var($s, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_OCTAL) !== false;
}

Résultats:

var_dump(test('0123') ); // true
var_dump(test('01090')); // false !!

Pour permettre la notation hexadécimale:

function test($s)
{
   return filter_var($s, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX) !== false;
}

Résultats:

var_dump(test('0xFF')); // true !!

11voto

Gordon Points 156415

Ne voulez pas transformer accidentellement la réponse de Jhong en CW, donc pour mémoire, voici les résultats lors des tests avec === au lieu de == .

 function test($var) {
    return ((string)(int)$var === $var);
}

var_dump( test(1)             ); // returns false vs TRUE
var_dump( test('1')           ); // returns TRUE
var_dump( test('1.0')         ); // returns false vs TRUE
var_dump( test('1.1')         ); // returns false 
var_dump( test('0xFF')        ); // returns false
var_dump( test('0123')        ); // returns false vs TRUE
var_dump( test('-0123')       ); // returns false vs TRUE
var_dump( test('-1000000')    ); // returns TRUE
var_dump( test('+1000000')    ); // returns false vs TRUE
var_dump( test('2147483648')  ); // returns false
var_dump( test('-2147483649') ); // returns false
 

9voto

Darragh Points 3854

Désolé si cette question a été répondu, mais cela a fonctionné pour moi dans le passé:

Vérifiez d'abord si la chaîne de caractères is_numeric. si c'est ajouter un 0 de la valeur pour obtenir PHP pour convertir la chaîne de son type. Ensuite, vous pouvez vérifier si c'est un int avec is_int. Rapide et sale, mais cela fonctionne pour moi...

$values = array(1, '2', '2.5', 'foo', '0xFF', 0xCC, 0644, '0777');

foreach ($values as $value) {
  $result = is_numeric($value) && is_int(($value + 0)) ? 'true' : 'false';
  echo $value . ': ' . $result . '<br />';
}

Résultats:

1: true
2: true
2.5: false
foo: false
0xFF: true
204: true
420: true
0777: true

Le seul problème est qu'il permettra d'évaluer les valeurs octales enveloppé dans une chaîne littérale, je.e: '0123' va tout simplement devenir 123. Mais c'est facile à répondre :)

4voto

nico Points 21115

Autre option

 function holds_int($str)
   {
   return preg_match("/^-?[0-9]+$/", $str);
   }
 

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