PHP 7.4.8 Released!


(PHP 4, PHP 5, PHP 7)

intvalObtiene el valor entero de una variable


intval ( mixed $var [, int $base = 10 ] ) : int

Devuelve el valor integer de una var, con la especificada base para la conversión (por defecto es base 10). No debería ser usado en objetos, si es usado emitirá un error de nivel E_NOTICE y devolverá 1.



El valor escalar a convertir a un entero


La base para la conversión


Si base es 0, la base usada estará determinada por el formato de var:

  • si el string incuye el prefijo "0x" (o "0X"), la base se tomará como 16 (hex); si no,
  • si el string comienza con "0", la base se tomará como 8 (octal); si no,
  • la base se toma como 10 (decimal).

Valores devueltos

El valor entero de var en caso de éxito, o 0 en caso de error. Arrays vacíos devuelven 0, arrays no vacíos devuelven 1.

El valor máximo depende del sistema. Los sistemas de 32 bits tienen un rango máximo para un entero con signo que va desde -2147483648 a 2147483647. Así, por ejemplo, en tal sistema, intval('1000000000000') devolverá 2147483647. El valor máximo para un entero con signo en sistemas de 64 bits es 9223372036854775807.

Las cadenas muy probablemente devolverán 0, aunque esto depende de los carácteres del extremo izquierdo de la cadena. Aplican las reglas comunes para moldeado de enteros.


Ejemplo #1 Ejemplos de intval()

Los siguientes ejemplos se basan en un sistema de 32 bits.

echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(428);                   // 42
echo intval('42'8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo''bar'));     // 1



El parámetro base no tiene ningún efecto a menos que el parámetro var sea una cadena.

Historial de cambios

Versión Descripción
5.1.0 Lanza E_NOTICE y devuelve 1, cuando se pasa un objecto a var.

Ver también

add a note add a note

User Contributed Notes 17 notes

8 years ago
Not mentioned elsewhere: intval(NULL) also returns 0.
leon at leonidasjp dot nl
3 years ago
It seems intval is interpreting valid numeric strings differently between PHP 5.6 and 7.0 on one hand, and PHP 7.1 on the other hand.

echo intval('1e5');

will return 1 on PHP 5.6 and PHP 7.0,
but it will return 100000 on PHP 7.1.
2 years ago
The binary notation is NOT supported until php7.2
// PHP <7.2 | PHP >=7.2
echo intval(0b11);       //    3     |     3
echo intval(-0b11);      //   -3     |    -3
echo intval('0b11');     //    0     |     0
echo intval('-0b11');    //    0     |     0
echo intval('0b11', 0);  //    0     |     3
echo intval('-0b11', 0); //    0     |    -3
winbill at hotmail dot com
9 years ago
Be careful :

intval($n*100); // prints 1998
print intval(strval($n*100)); // prints 1999
zak at php dot net
19 years ago
intval converts doubles to integers by truncating the fractional component of the number.

When dealing with some values, this can give odd results.  Consider the following:

print intval ((0.1 + 0.7) * 10);

This will most likely print out 7, instead of the expected value of 8.

For more information, see the section on floating point numbers in the PHP manual (

Also note that if you try to convert a string to an integer, the result is often 0.

However, if the leftmost character of a string looks like a valid numeric value, then PHP will keep reading the string until a character that is not valid in a number is encountered.

For example:

"101 Dalmations" will convert to 101

"$1,000,000" will convert to 0 (the 1st character is not a valid start for a number

"80,000 leagues ..." will convert to 80

"1.4e98 microLenats were generated when..." will convert to 1.4e98

Also note that only decimal base numbers are recognized in strings.

"099" will convert to 99, while "0x99" will convert to 0.

One additional note on the behavior of intval.  If you specify the base argument, the var argument should be a string - otherwise the base will not be applied.

For Example:

print intval (77, 8);   // Prints 77
print intval ('77', 8); // Prints 63
Ben Laurienti
14 years ago
You guys are going to love this.  I found something that I found quite disturbing.

$test1 = intVal(1999);

$amount = 19.99 * 100;
$test2 = intVal($amount);
$test3 = intVal("$amount");

echo $test1 . "<br />\n";
echo $test2 . "<br />\n";
echo $test3 . "<br />\n";

expected output:

actual output

Appears to be a floating point issue, but the number 1999 is the only number that I was able to get to do this.  19.99 is the price of many things, and for our purpose we must pass it as 1999 instead of 19.99.
spoon_reloaded at gmail dot com
11 years ago
Here is a really useful undocumented feature:

You can have it automatically deduce the base of the number from the prefix of the string using the same syntax as integer literals in PHP ("0x" for hexadecimal, "0" for octal, non-"0" for decimal) by passing a base of 0 to intval():

echo intval("0x1a", 0), "\n"; // hex; prints "26"
echo intval("057", 0), "\n"; // octal; prints "47"
echo intval("42", 0), "\n"; // decimal; prints "42"
espertalhao04 at hotmail dot com
7 years ago
if you want to take a number from a string, no matter what it may contain, here is a good solution:

function int($s){return(int)preg_replace('/[^\-\d]*(\-?\d*).*/','$1',$s);}

//output: 18
this example returns an int, so it will follow the int rules, and has support for negative values.

function int($s){return($a=preg_replace('/[^\-\d]*(\-?\d*).*/','$1',$s))?$a:'0';}

//output: -1809809808908099878758765

this one returns a string with just the numeric value.
it also supports negative values.

the latter is better when you have a 32 bit system and you want a huge int that is higher than PHP_MAX_INT.
chinmay235 at gmail dot com
2 years ago
echo intval("10 days");          //10
echo intval("days 10");          //0
tuxedobob at mac dot com
16 years ago
Sometimes intval just won't cut it. For example if you want to use an unsigned 32-bit int and need all 32 bits. Recently, I wrote a little script that took and integer and converted it to an IP address. After realizing I couldn't just mod the whole thing, since the sign bit throws it off (and compensating for that), we ran into a problem where if it was entered into a form, the value somehow wasn't converted to an integer properly, at least not implicitly. The solution for this, and the way I recommend converting a string to an integer, is:

$num = $num + 0;

and PHP will leave your number alone; it'll just know it's a number. Such is the fun of a loosely-typed language. :)
taylorsarrafian at gmail dot com
5 years ago


// observe the following
echo intval( strval( -0.0001 ) ); // 0
echo intval( strval( -0.00001 ) ); // -1

   // this is because
echo strval( -0.0001 ); // -.0001
echo strval( -0.00001 ); // -1.0E-5

   // thus beware when using
function trunc2_bad( $n ) {
intval( strval( $n * 100 ) / 100 );

// use this instead
function trunc2_good( $n ) {
intval( floatval( strval( $n * 100 )  ) / 100 );

mkamerma at science dot uva dot nl
14 years ago
As addendum, the "if ($int > 0)" check in the encode function is redundant. It doesn't do anything bad to keep it in since it will always be true when reaching that point, but it's a meaningless conditional this way. It's a remnant from when I tried to write the function in terms of bitshifts, which could lead to negative ints when shifting if the 32nd bit was set (instead of always padding with 0's when using >> it pads with 1's leading to negative ints).
pfreet at gmail dot com
7 years ago
Do not use intval() when you really want round(). This is due to how PHP handles precision.

echo number_format(8.20*100, 20), "<br />";
echo intval(8.20*100), "<br />";
echo floor(8.20*100), "<br />";
echo round(8.20*100), "<br />";

Anony Moose
1 month ago
As a warning, do not use this function alone for input validation.

Vulnerable example:
if(isset($_GET['id']) && intval($_GET['id']) > 0){

The following requests would pass this filter:

/page.php?id=1' OR '1'='1

Instead use the is_numeric() function for integer validation:

echo intval("10oops"); // 10
echo is_numeric("10oops");  // false

Secure example:
if(isset($_GET['id']) && is_numeric($_GET['id']) && intval($_GET['id']) > 0){
9 years ago
The behaviour of intval() is interesting when supplying a base, and you better check your intval base-based expressions, as it is counter-intuitive.
As the example shows
('42', 8); // => 34
intval(42, 8);   // => 42 !
PHP considers the 42 as being already an integer, and doesn't apply any conversion. And supplying
(49, 8);  // => 49 !
produces no error and no warning.
5 months ago
PHP 7.2

$test = intval(150.20*100); //15019
$test2 = intval(15020); //15020
$test3 = intval(15020.0); //15020
$test4 = 150.20*100; //15020.0
simon at npkk dot cz
14 years ago
Still have on mind, that if you convert big numbers by adding zero, PHP makes automatic "to a float" conversion, so it is same as floatVal(). So if the number is realy big (over 13 digits), you can lose preciosity. Do not use it for such long numbers, if all bits do matter (IPv6 addresses and similar).
To Top