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 For situations when you do know the target type (as you should), one of the type casting operators can be used:
$num = "42"; $int = (int)$num; $num = "3.14"; $float = (float)$num; as well as one of their aliases, such as intval(), floatval() or settype().
Notice that PHP would try to make a number from such not-so-numeric strings as " 42 ", or "42 The Answer to the Ultimate Question of Life, the Universe, and Everything" - by applying trim() and picking the leading number before conversion. Scientific notation is also recognized.
When you don't know the target type, a simple arithmetic operation, $num + 0, or $num * 1 can be used, as well as identity operator suggested in this answer (which seems to be an alias for the latter calculation):
$num = "42"; $int = +$num; $num = "3.14"; $float = +$num; However, unlike casting operators, these calculations would raise a Type error, when source value is not numeric (and a Warning then it's not-so-numeric). Which is a good thing, because you cannot get a sensible result from making a number from string 'foo' or an array. Consider validating/normalizing input values to avoid such errors.
. is the decimal point separator. en.wikipedia.org/wiki/…There are a few ways to do so:
Cast the strings to numeric primitive data types:
$num = (int) "10"; $num = (double) "10.12"; // same as (float) "10.12"; Perform math operations on the strings:
$num = "10" + 0; $num = floor("10.1"); Use intval() or floatval():
$num = intval("10"); $num = floatval("10.1"); Use settype().
(double) is just an alias for (float).intval("9999999999")==2147483647.intval is useful because then you can use it in array_map('intval', $arrayOfStrings); which you can't do with casting.$num = "10" + 1; it's better to use $num = "10" * 1; since that will not change the value (neutral element of multiplication), this is essentially something like toNumber(..) since the final type will be determined by what is needed to convert the string "10" -> (int) 10; "10.1" -> (float) 10.1;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 ?> 12.7896?(int)$my_str wouldn't work since I was dealing specifically with strings liks 01 and 013 that I want to interpret as base 10... So I wanted a way to explicitly provide the base.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; 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:
To convert a numeric string to a number, do as follows:
$a = +$a; is_numeric, so have a place to put code to handle strings that can't convert correctly.)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.
strpos($val, '.') === false ? intval($val) : floatval($val);2.1e2, it has decimal point, but resulting number is integer210.0 is a float, and in PHP 2.1e2 is a float. Try it. Float has to do with the way the number gets stored in RAM and represented as a numeric literal.+ identity operator: var_dump(+'0.4', +'4'), gives you a float and an int. php.net/manual/en/language.operators.arithmetic.phpYou can use:
(int)(your value); Or you can use:
intval(string) 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) A non well formed numeric value encountered. any idea?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 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
is_numeric($str) helps with this. (As shown in two of the earlier answers - so its not quite accurate that "nobody mentioned the biggest caveat" - though I see no one explained the issue in detail.)var_dump((int) '123Z' === 123) // bool(true).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; } } 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 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) $id_cron = (string)date('YmdHi'); $target_id_cron = $id_cron - 1; instead of $target_id_cron = (int)$id_cron - 1;A non well formed numeric value encountered when I want to change string to float $num = '12,24' * 1. Any suggestion?PHP is anglo-centric. Only recognizes . as decimal separator. Try '12.24' * 1. Though personally I prefer + 0. Addition instead of multiplication.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) 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'; 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.
$var = +$str; -- the identity operator.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 Simply you can write like this:
<?php $data = ["1","2","3","4","5"]; echo json_encode($data, JSON_NUMERIC_CHECK); ?> 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)
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.
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; } (123)456-7890, and you want to extract 1234567890 from that? Or is the idea that it finds the first number, so would result in 123 in my example?
intorfloat(you usually don't want afloatwhen anintis given).