How do I convert a string to a number in PHP?

PhpCastingType Conversion

Php Problem Overview


I want to convert these types of values, '3', '2.34', '0.234343', etc. to a number. In JavaScript we can use Number(), but is there any similar method available in PHP?

Input             Output
'2'               2
'2.34'            2.34
'0.3454545'       0.3454545

Php Solutions


Solution 1 - Php

You don't typically need to do this, since PHP will coerce the type for you in most circumstances. For situations where you do want to explicitly convert the type, cast it:

$num = "3.14";
$int = (int)$num;
$float = (float)$num;

Solution 2 - Php

There are a few ways to do so:

  1. Cast the strings to numeric primitive data types:

     $num = (int) "10";
     $num = (double) "10.12"; // same as (float) "10.12";
    
  2. Perform math operations on the strings:

     $num = "10" + 1;
     $num = floor("10.1");
    
  3. Use intval() or floatval():

     $num = intval("10");
     $num = floatval("10.1");
    
  4. Use http://php.net/manual/en/function.settype.php">`settype()`</a>;.

Solution 3 - Php

To avoid problems try intval($var). Some examples:

<?php
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 (octal as starts with zero)
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26 (hex as starts with 0x)
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(42, 8);                   // 42
echo intval('42', 8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1
?>

Solution 4 - Php

In whatever (loosely-typed) language you can always cast a string to a number by adding a zero to it.

However, there is very little sense in this as PHP will do it automatically at the time of using this variable, and it will be cast to a string anyway at the time of output.

Note that you may wish to keep dotted numbers as strings, because after casting to float it may be changed unpredictably, due to float numbers' nature.

Solution 5 - Php

Instead of having to choose whether to convert the string to int or float, you can simply add a 0 to it, and PHP will automatically convert the result to a numeric type.

// Being sure the string is actually a number
if (is_numeric($string))
    $number = $string + 0;
else // Let the number be 0 if the string is not a number
    $number = 0;

Solution 6 - Php

If you want get a float for $value = '0.4', but int for $value = '4', you can write:

$number = ($value == (int) $value) ? (int) $value : (float) $value;

It is little bit dirty, but it works.

Solution 7 - Php

Yes, there is a similar method in PHP, but it is so little known that you will rarely hear about it. It is an arithmetic operator called "identity", as described here:

Aritmetic Operators

To convert a numeric string to a number, do as follows:

$a = +$a;

Solution 8 - Php

You can use:

(int)(your value);

Or you can use:

intval(string)

Solution 9 - Php

In PHP you can use intval(string) or floatval(string) functions to convert strings to numbers.

Solution 10 - Php

You can always add zero to it!

Input             Output
'2' + 0           2 (int)
'2.34' + 0        2.34 (float)
'0.3454545' + 0   0.3454545 (float)

Solution 11 - Php

Just a little note to the answers that can be useful and safer in some cases. You may want to check if the string actually contains a valid numeric value first and only then convert it to a numeric type (for example if you have to manipulate data coming from a db that converts ints to strings). You can use is_numeric() and then floatval():

$a = "whatever"; // any variable

if (is_numeric($a)) 
    var_dump(floatval($a)); // type is float
else 
    var_dump($a); // any type

Solution 12 - Php

Here is the function that achieves what you are looking for. First we check if the value can be understood as a number, if so we turn it into an int and a float. If the int and float are the same (e.g., 5 == 5.0) then we return the int value. If the int and float are not the same (e.g., 5 != 5.3) then we assume you need the precision of the float and return that value. If the value isn't numeric we throw a warning and return null.

function toNumber($val) {
    if (is_numeric($val)) {
        $int = (int)$val;
        $float = (float)$val;

        $val = ($int == $float) ? $int : $float;
        return $val;
    } else {
        trigger_error("Cannot cast $val to a number", E_USER_WARNING);
        return null;
    }
}

Solution 13 - Php

If you want the numerical value of a string and you don't want to convert it to float/int because you're not sure, this trick will convert it to the proper type:

function get_numeric($val) {
  if (is_numeric($val)) {
    return $val + 0;
  }
  return 0;
}

Example:
<?php
get_numeric('3'); // int(3)
get_numeric('1.2'); // float(1.2)
get_numeric('3.0'); // float(3)
?>

Source: https://www.php.net/manual/en/function.is-numeric.php#107326

Solution 14 - Php

In addition to Boykodev's answer I suggest this:

Input             Output
'2' * 1           2 (int)
'2.34' * 1        2.34 (float)
'0.3454545' * 1   0.3454545 (float)

Solution 15 - Php

I've been reading through answers and didn't see anybody mention the biggest caveat in PHP's number conversion.

The most upvoted answer suggests doing the following:

$str = "3.14"
$intstr = (int)$str // now it's a number equal to 3

That's brilliant. PHP does direct casting. But what if we did the following?

$str = "3.14is_trash"
$intstr = (int)$str

Does PHP consider such conversions valid?

Apparently yes.

PHP reads the string until it finds first non-numerical character for the required type. Meaning that for integers, numerical characters are [0-9]. As a result, it reads 3, since it's in [0-9] character range, it continues reading. Reads . and stops there since it's not in [0-9] range.

Same would happen if you were to cast to float or double. PHP would read 3, then ., then 1, then 4, and would stop at i since it's not valid float numeric character.

As a result, "million" >= 1000000 evaluates to false, but "1000000million" >= 1000000 evaluates to true.

See also:

https://www.php.net/manual/en/language.operators.comparison.php how conversions are done while comparing

https://www.php.net/manual/en/language.types.string.php#language.types.string.conversion how strings are converted to respective numbers

Solution 16 - Php

Here is a function I wrote to simplify things for myself:

It also returns shorthand versions of boolean, integer, double and real.

function type($mixed, $parseNumeric = false)
{        
    if ($parseNumeric && is_numeric($mixed)) {
        //Set type to relevant numeric format
        $mixed += 0;
    }
    $t = gettype($mixed);
    switch($t) {
        case 'boolean': return 'bool'; //shorthand
        case 'integer': return 'int';  //shorthand
        case 'double': case 'real': return 'float'; //equivalent for all intents and purposes
        default: return $t;
    }
}

Calling type with parseNumeric set to true will convert numeric strings before checking type.

Thus:

type("5", true) will return int

type("3.7", true) will return float

type("500") will return string

Just be careful since this is a kind of false checking method and your actual variable will still be a string. You will need to convert the actual variable to the correct type if needed. I just needed it to check if the database should load an item id or alias, thus not having any unexpected effects since it will be parsed as string at run time anyway.

Edit

If you would like to detect if objects are functions add this case to the switch:

case 'object': return is_callable($mixed)?'function':'object';

Solution 17 - Php

Only multiply the number by 1 so that the string is converted to type number.

//String value
$string = "5.1"
if(is_numeric($string)){
  $numeric_string = $string*1;
}

Solution 18 - Php

I've found that in JavaScript a simple way to convert a string to a number is to multiply it by 1. It resolves the concatenation problem, because the "+" symbol has multiple uses in JavaScript, while the "*" symbol is purely for mathematical multiplication.

Based on what I've seen here regarding PHP automatically being willing to interpret a digit-containing string as a number (and the comments about adding, since in PHP the "+" is purely for mathematical addition), this multiply trick works just fine for PHP, also.

I have tested it, and it does work... Although depending on how you acquired the string, you might want to apply the trim() function to it, before multiplying by 1.

Solution 19 - Php

Late to the party, but here is another approach:

function cast_to_number($input) {
    if(is_float($input) || is_int($input)) {
        return $input;
    }
    if(!is_string($input)) {
        return false;
    }
    if(preg_match('/^-?\d+$/', $input)) {
        return intval($input);
    }
    if(preg_match('/^-?\d+\.\d+$/', $input)) {
        return floatval($input);
    }
    return false;
}

cast_to_number('123.45');       // (float) 123.45
cast_to_number('-123.45');      // (float) -123.45
cast_to_number('123');          // (int) 123
cast_to_number('-123');         // (int) -123
cast_to_number('foo 123 bar');  // false

Solution 20 - Php

$a = "10";

$b = (int)$a;

You can use this to convert a string to an int in PHP.

Solution 21 - Php

You can use:

((int) $var)   ( but in big number it return 2147483647 :-) )

But the best solution is to use:

if (is_numeric($var))
    $var = (isset($var)) ? $var : 0;
else
    $var = 0;

Or

if (is_numeric($var))
    $var = (trim($var) == '') ? 0 : $var;
else
    $var = 0;

Solution 22 - Php

Simply you can write like this:

<?php
    $data = ["1","2","3","4","5"];
    echo json_encode($data, JSON_NUMERIC_CHECK);
?>

Solution 23 - Php

There is a way:

$value = json_decode(json_encode($value, JSON_NUMERIC_CHECK|JSON_PRESERVE_ZERO_FRACTION|JSON_UNESCAPED_SLASHES), true);

Using is_* won't work, since the variable is a: string.

Using the combination of json_encode() and then json_decode() it's converted to it's "true" form. If it's a true string then it would output wrong.

$num = "Me";
$int = (int)$num;
$float = (float)$num;

var_dump($num, $int, $float);

Will output: string(2) "Me" int(0) float(0)

Solution 24 - Php

Alright so I just ran into this issue. My problem is that the numbers/strings in question having varying numbers of digits. Some have no decimals, others have several. So for me, using int, float, double, intval, or floatval all gave me different results depending on the number.

So, simple solution... divide the string by 1 server-side. This forces it to a number and retains all digits while trimming unnecessary 0's. It's not pretty, but it works.

"your number string" / 1

Input 		Output
"17"		17
"84.874"	84.874
".00234"	.00234
".123000"   .123
"032"		32

Solution 25 - Php

You can change the data type as follows

$number = "1.234";

echo gettype ($number) . "\n"; //Returns string

settype($number , "float");

echo gettype ($number) . "\n"; //Returns float

For historical reasons "double" is returned in case of a float.

PHP Documentation

Solution 26 - Php

All suggestions lose the numeric type.

This seems to me a best practice:

function str2num($s){
// Returns a num or FALSE
    $return_value =  !is_numeric($s) ? false :               (intval($s)==floatval($s)) ? intval($s) :floatval($s);
    print "\nret=$return_value type=".gettype($return_value)."\n";
}

Solution 27 - Php

If you don't know in advance if you have a float or an integer,
and if the string may contain special characters (like space, €, etc),
and if it may contain more than 1 dot or comma,
you may use this function:

// This function strip spaces and other characters from a string and return a number.
// It works for integer and float.
// It expect decimal delimiter to be either a '.' or ','
// Note: everything after an eventual 2nd decimal delimiter will be removed.
function stringToNumber($string) {
	// return 0 if the string contains no number at all or is not a string:
    if (!is_string($string) || !preg_match('/\d/', $string)) {
        return 0;
    } 
    
	// Replace all ',' with '.':
	$workingString = str_replace(',', '.', $string);

	// Keep only number and '.':
	$workingString = preg_replace("/[^0-9.]+/", "", $workingString);
	
	// Split the integer part and the decimal part,
	// (and eventually a third part if there are more 
	//     than 1 decimal delimiter in the string):
	$explodedString = explode('.', $workingString, 3);

    if ($explodedString[0] === '') {
        // No number was present before the first decimal delimiter, 
        // so we assume it was meant to be a 0:
        $explodedString[0] = '0';
    } 

	if (sizeof($explodedString) === 1) {
		// No decimal delimiter was present in the string,
		// create a string representing an integer:
		$workingString = $explodedString[0];
	} else {
		// A decimal delimiter was present,
		// create a string representing a float:
		$workingString = $explodedString[0] . '.' .  $explodedString[1];
	}

	// Create a number from this now non-ambiguous string:
	$number = $workingString * 1;

	return $number;
}

Solution 28 - Php

//Get Only number from string
$string = "123 Hello Zahid";
$res = preg_replace("/[^0-9]/", "", $string);
echo $res."<br>";
//Result 123

Solution 29 - Php

One of the many ways it can be achieved is this:

$fileDownloadCount          =  (int) column_data_from_db;
$fileDownloadCount++;

The second line increments the value by 1.

Solution 30 - Php

PHP will do it for you within limits

<?php
   $str = "3.148";
   $num = $str;

   printf("%f\n", $num);
?>

Solution 31 - Php

Now we are in an era where strict/strong typing has a greater sense of importance in PHP, I use json_decode:

$num = json_decode('123');

var_dump($num); // outputs int(123)

$num = json_decode('123.45');

var_dump($num); // outputs float(123.45)

Solution 32 - Php

function convert_to_number($number) {
    return is_numeric($number) ? ($number + 0) : FALSE;
}

Solution 33 - Php

I got the question "say you were writing the built in function for casting an integer to a string in PHP, how would you write that function" in a programming interview. Here's a solution.

$nums = ["0","1","2","3","4","5","6","7","8","9"];
$int = 15939; 
$string = ""; 
while ($int) { 
    $string .= $nums[$int % 10]; 
    $int = (int)($int / 10); 
} 
$result = strrev($string);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSaraView Question on Stackoverflow
Solution 1 - PhpdecezeView Answer on Stackoverflow
Solution 2 - PhpfardjadView Answer on Stackoverflow
Solution 3 - PhpgopecaView Answer on Stackoverflow
Solution 4 - PhpYour Common SenseView Answer on Stackoverflow
Solution 5 - PhpwebNeatView Answer on Stackoverflow
Solution 6 - PhpAleksei AkireikinView Answer on Stackoverflow
Solution 7 - PhpaldemarcalazansView Answer on Stackoverflow
Solution 8 - Phpnoobie-phpView Answer on Stackoverflow
Solution 9 - PhpKashif KhanView Answer on Stackoverflow
Solution 10 - PhpBoykodevView Answer on Stackoverflow
Solution 11 - PhptaseenbView Answer on Stackoverflow
Solution 12 - PhpCogSciGradStudentView Answer on Stackoverflow
Solution 13 - PhpklodomaView Answer on Stackoverflow
Solution 14 - PhpdruganView Answer on Stackoverflow
Solution 15 - PhpDragasView Answer on Stackoverflow
Solution 16 - PhpDieter GribnitzView Answer on Stackoverflow
Solution 17 - PhprolodefView Answer on Stackoverflow
Solution 18 - Phpvernonner3voltazimView Answer on Stackoverflow
Solution 19 - PhpBenniView Answer on Stackoverflow
Solution 20 - PhpPritomView Answer on Stackoverflow
Solution 21 - PhpMehdi AjdariView Answer on Stackoverflow
Solution 22 - PhpDominic Amal Joe FView Answer on Stackoverflow
Solution 23 - PhpAnugaView Answer on Stackoverflow
Solution 24 - PhpMikelGView Answer on Stackoverflow
Solution 25 - PhpDavid LozanoView Answer on Stackoverflow
Solution 26 - PhpRocco GalassoView Answer on Stackoverflow
Solution 27 - Phpuser1657853View Answer on Stackoverflow
Solution 28 - PhpZahid GaniView Answer on Stackoverflow
Solution 29 - PhphackernewbieView Answer on Stackoverflow
Solution 30 - PhpAdrian CornishView Answer on Stackoverflow
Solution 31 - PhpAndyView Answer on Stackoverflow
Solution 32 - PhpHewr ChelseaView Answer on Stackoverflow
Solution 33 - PhpBrendanView Answer on Stackoverflow