web-dev-qa-db-fra.com

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.
34
Emanuil Rusev
if((string)(int)$var == $var) {
    echo 'var is an integer or a string representation of an integer';
}

Exemple 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 === était utilisé à des fins de comparaison au lieu de ==.

62
Jhong

Pas la méthode la plus rapide, mais filter_var() est assez précis:

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

Voici les résultats basés sur réponse de Jhong's 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 autoriser les entiers octaux:

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 autoriser 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 !!
12
Ja͢ck

Ne voulez pas transformer accidentellement la réponse de Jung en CW, donc voici les résultats lors du test 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
10
Gordon

Update Depuis PHP 7.1, l'utilisation de is_int() avec des valeurs non numériques pose des problèmes, comme indiqué dans ce document SO Réponse . En tout cas, c'est une très vieille réponse et je la percevrais vraiment comme une sorte de bidouille à ce stade, donc YMMV;)

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

Commencez par vérifier si la chaîne is_numeric. si c'est le cas, ajoutez un 0 à la valeur à obtenir PHP pour convertir la chaîne en son type approprié. Ensuite, vous pouvez vérifier si c'est un int avec is_int. Rapide et sale mais ça marche 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 évaluera littéralement les valeurs octales encapsulées dans une chaîne, c'est-à-dire: "0123" deviendra tout simplement 123. Mais c'est facile à résoudre :)

8
Darragh Enright

Si la chaîne contient des espaces, alors la réponse de @ Jack ne fournira pas un résultat précis .

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

La chaîne ci-dessus ne sera pas un int conformément à la vérification ci-dessus.

Donc, au lieu d’utiliser ceci, essayez de suivre:

if(ctype_digit(trim('19  '))){
    echo 'it is digit ';
}else{
    echo 'it is not digit ';
}
4
Raza Ahmed

Autre option

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

Peut-être que cela aidera aussi dans une situation donnée Il existe une fonction dans php qui le fait déjà, elle s'appelle "is_numeric ()" Elle retournera vrai ou faux en accord .. 

   if(is_numeric($somestring) == True){
        echo "this string contains a integar";
    }

lien: http://www.php.net/is_numeric

vous avez dit que "holdint (" 2 ") devrait renvoyer true, ainsi que is_numeric (" 2 ") renvoie True et is_numeric (" a ") False, comme prévu, cette fonction existe dans php, vous n'avez pas besoin de la réécrire.

2
scott

J'ai aimé la suggestion de nyson, mais j'ai remarqué que ce serait faux pour '0123' . Je fais maintenant ceci:

(string)(int)$var === ltrim((string)$var, '0')

(Cela aurait été posté en tant que commentaire @nyson, mais je n'ai pas encore assez de privilèges pour le faire).

Modifié pour ajouter: Si vous voulez que zéro soit vrai, vous devez faire quelque chose comme

(int)$var === 0 || (string)(int)$var === ltrim((string)$var, '0')
1
HalfTitle

Je l'utilise depuis longtemps . Si vous voulez détecter une chose int value possible, y compris 1.0 "1.0" 1e3 "007", vous feriez mieux de laissez is_numeric faire son travail de détecter tout possible PHP objet qui représente un nombre, et seulement ensuite vérifier si ce nombre est un int.

function isIntValued($var) {
    if(is_numeric($var)) { // At least it's number, can be converted to float
        $var=(float)$var; // Now it is a float
        return ((float)(int)$var)===$var;
    }
    return FALSE;
}

ou en bref

function isIntValued($var) {
    return (!is_numeric($var)?FALSE:((float)(int)(float)$var)===(float)$var);
}

Notez que bien que is_int() de PHP vérifie si le type de la variable est un entier, au contraire, l’autre fonction PHP standard is_numeric() détermine très précisément si le contenu de la variable _ c'est-à-dire des caractères de chaîne) peut représente un nombre.

1
FrancescoMM

comparaison.php:

<?php
function is_numeric_int($s)
{
  return (strval(intval($s)) === $s);
}

function print_ini($s)
{
  echo "$s: " . ( is_numeric_int($s) ? 'true' : 'false' ) . "\n";
}

print_ini('qwe');
print_ini('23');
print_ini('-23');
print_ini('23.0');
print_ini('-23.0');
?>

Essai:

$ php comparison.php 
qwe: false
23: true
-23: true
23.0: false
-23.0: false
1
clacke

Si vous utilisez la bibliothèque Assert dans votre projet ( https://github.com/beberlei/assert ), vous pouvez facilement le faire en une seule ligne:

Assertion::integerish($var);

Note: il lève une exception en cas de violation de l'assertion.

0
Aleksandr Shpagin