2010-07-31 26 views
32

¿Conoce una función que pueda verificar si una cadena contiene un número entero?Verificar si una cadena contiene un número entero

Así es como yo esperaría que funcione:

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

* (relacionado) * [Compruebe si la cadena es una marca de tiempo Unix] (http://stackoverflow.com/questions/2524680/check-whether-the-string-is-a-unix-timestamp/2524761# 2524761) - la prueba es básicamente la misma – Gordon

+0

¿Por qué es necesario? – mathk

+0

@mathk: necesito validar la entrada del usuario. –

Respuesta

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

resultados Ejemplo:

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 

Véase la respuesta de Gordon a continuación cómo esto podría comportarse de manera diferente si === se utilizaron para la comparación en lugar de ==.

+3

esto debería probar con '===' y asegúrese de que el número esté dentro del rango entero – Gordon

+6

=== no funcionará si $ var en realidad es un número entero. == will, independientemente de si es una cadena o un int. OP no lo solicitó específicamente, pero parece un poco perverso devolver falso si en realidad es un número entero. – Jhong

+0

Tampoco tiene sentido la verificación adicional para PHP_INT_MAX; lo anterior dará como resultado falso si el entero está fuera de rango de todos modos. ¿Por qué agregar el cheque adicional? – Jhong

4

Otra opción

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

Esto (en su forma actual) tampoco tiene en cuenta los enteros negativos. – VolkerK

+0

@VolkerK: Lo estaba editando, ahora lo hace – nico

+0

¿Por qué el voto a favor? Esto hace exactamente lo que el OP solicitó. – nico

1

puede haber dos casos-

  1. Es necesario comprobar para el formato de cadena exacta de un número (la mayor parte de la American National Standard se trata de éste)

  2. Desea verificar si una cadena contiene un número específico o no

    preg_match('/'.$matching_number.'/',$container_string);

9

no desea activar accidentalmente la respuesta de Jhong en un CW, por lo que para el registro aquí es el resultado cuando se prueba con === en lugar 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 
+1

1.0 (flotante) y(no válido) son mejores resultados aquí que mi versión - ¡No los había considerado! – Jhong

+0

@Jhong usando '==' también devolverá verdadero para hex '0xFF' y notación científica' -1.3e3' (ej. Ambos cuando no se usa como cadena, falso si se usa como cadena) – Gordon

1

comparison.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'); 
?> 

Prueba de funcionamiento:

$ php comparison.php 
qwe: false 
23: true 
-23: true 
23.0: false 
-23.0: false 
-3

is_int es el único lo que está destinado a hacer este trabajo.

+0

'is_int' determina si el _type_ del variable es un número entero, no el _valor_. – Josh

8

actualización Desde PHP 7.1 hay problemas con el uso de is_int() con valores no numéricos, como se discute en este SO Answer. En cualquier caso, esta es una respuesta muy viejo y realmente me ven como una especie de truco en este punto por lo que tu caso es distinto;)

Lo siento si esta pregunta se ha respondido, pero esto ha funcionado para mí en el pasado:

Primero compruebe si la cadena is_numeric. si es agregar un 0 al valor para que PHP encubra la cadena a su tipo relevante. Luego puede verificar si es una int con is_int. Rápidos y sucios, pero funciona para mí ...

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

Resultados:

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

El único problema es que va a evaluar los valores octales envueltos en una cadena literal, es decir: '0123' simplemente se convertirse en 123.Pero eso es fácil de abordar :)

+1

Cuando un valor no es realmente un número, como 'foo', obtengo el siguiente * Error de PHP *:' Se encontró un valor no numérico'. Estoy usando 'PHP 7.1.3'. [Una respuesta relacionada con esto] (http://stackoverflow.com/a/42044413/1883256). Y [aconsejan no usar is_int() aquí] (https://odd.blog/2009/03/31/php-is_numeric-vs-is_int/) – Pathros

+0

Gracias por su comentario @Pathros - como pueden ver esto es una respuesta de 7 años, por lo que parece que hay un cambio en el comportamiento desde PHP 7.1. Editaré mi respuesta para tomar nota del cambio. –

11
No

el método más rápido, pero filter_var() es bastante exacta:

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

Éstos son los resultados basados ​​en Jhong de answer, diferencias marcadas con !!:

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 

Para permitir números enteros octales:

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

Resultados:

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

para permitir notación hexadecimal:

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

Resultados:

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

Acabo de utilizar su función y tiene problemas con números grandes. Dado el hecho de que el requisito es verificar si una cadena contiene un número entero, pero no dice cuánto tiempo puede ser, creo que un enfoque de expresión regular podría ser mejor en este caso. Para un número como 999999999999999999 funcionará, pero si intenta, por ejemplo, con una cadena que contiene el número 9999999999999999999, que es un entero válido, fallará. –

+0

@JeanPaulRuiz seguro, esa es una forma de interpretación, mi método comprueba si se puede asignar a una variable :) –

4

Si la cadena contiene espacios, a continuación, @ respuesta de Jack no proporcionará resultados precisos. p.

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

La cadena anterior no será un int de acuerdo con la comprobación anterior.

Así que en lugar de usar esto, intente lo siguiente:

if(ctype_digit(trim('19 '))){ 
    echo 'it is digit '; 
}else{ 
    echo 'it is not digit '; 
} 
+0

En realidad, mi respuesta arroja 'true' para' "19" '; debes confundirte con la respuesta de Jhong. –

2

Tal vez esto también ayudará en la situación dada hay una función en PHP que ya hace esto, se llama "is_numeric()" lo hará devolver verdadero o falso accordenly ..

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

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

usted dijo "holdsint (" 2") debería devolver verdadero, bien is_numeric ("2") devuelve True e is_numeric ("a") False, como se esperaba, esta función existe en php, no es necesario volver a escribir.

+2

Esto es incorrecto; 'is_numeric()' devuelve 'true' para flotantes. – Tristan

+0

ahh sí, pero al igual que la mayoría de las cosas aquí, en el momento de la publicación era correcto para la pregunta original, no mencionaba las carrozas, entonces el cartel original fue y editó su pregunta, así que ahora me veo como el idiota. Típico. – scott

1

Me gustó la sugerencia de nyson, pero me di cuenta de que sería falso para '0123'. ahora estoy haciendo esto:

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

(Esto habría sido publicado como un comentario @nyson, pero no tiene suficientes privilegios para hacerlo aún).

Editado para añadir: Si desea cero para ser verdad, tiene que hacer algo como

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

ctype_digit hará el truco:

ctype_digit($str)

  1. $str tiene que ser una cadena
  2. espacios adicionales no están permitidos
  3. sin puntos decimales .
0

Si utiliza la biblioteca aserción en que proyecto (https://github.com/beberlei/assert) que fácilmente puede hacerlo en una sola línea:

Assertion::integerish($var); 

Nota: se genera una excepción en el caso de violar la afirmación.

Cuestiones relacionadas