Je veux convertir ces types de valeurs, '3'
, '2.34'
, '0.234343'
, etc. en un nombre. En JavaScript, nous pouvons utiliser Number()
, mais existe-t-il une méthode similaire disponible en PHP?
Input Output
'2' 2
'2.34' 2.34
'0.3454545' 0.3454545
Vous n'avez généralement pas besoin de le faire, car PHP va forcer le type pour vous dans la plupart des cas. Pour les situations où vous souhaitez explicitement convertir le type, cast it:
$num = "3.14";
$int = (int)$num;
$float = (float)$num;
Il y a plusieurs façons de le faire:
Convertissez les chaînes en types de données primitifs numériques:
$num = (int) "10";
$num = (double) "10.12"; // same as (float) "10.12";
Effectuer des opérations mathématiques sur les chaînes:
$num = "10" + 1;
$num = floor("10.1");
Utilisez intval()
ou floatval()
:
$num = intval("10");
$num = floatval("10.1");
Utilisez settype()
.
Quelle que soit la langue (peu typée), vous pouvez toujours convertir une chaîne en un nombre en y ajoutant un zéro.
Cependant, cela a très peu de sens car PHP le fera automatiquement au moment de l’utilisation de cette variable, qui sera néanmoins convertie en chaîne au moment de la sortie.
Notez que vous souhaiterez peut-être conserver les nombres en pointillés sous forme de chaînes, car après le transfert en flottant, ils peuvent être modifiés de manière imprévisible, en raison de la nature des nombres en flottant.
Pour éviter les problèmes, essayez intval($var)
. Quelques exemples:
<?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
?>
Vous pouvez utiliser:
(int)(your value);
Ou vous pouvez utiliser:
intval(string)
Si vous voulez obtenir un float pour $value = '0.4'
, mais int pour $value = '4'
, vous pouvez écrire:
$number = ($value == (int) $value) ? (int) $value : (float) $value;
C'est un peu sale, mais ça marche.
Vous pouvez utiliser (int)_value_
par exemple.
$string = '100';
$int = (int)$string;
Voir Type Juggling .
Vous pouvez toujours ajouter zéro à cela!
Input Output
'2' + 0 2 (int)
'2.34' + 0 2.34 (float)
'0.3454545' + 0 0.3454545 (float)
Au lieu de choisir de convertir la string
en int
ou float
, vous pouvez simplement y ajouter un 0
, et PHP automatiquement convertir le résultat en un type numérique.
// 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;
Dans PHP , vous pouvez utiliser les fonctions intval(string) or floatval(string)
pour convertir des chaînes en nombres.
Juste une petite note sur les réponses qui peuvent être utiles et plus sûres dans certains cas. Vous voudrez peut-être vérifier si la chaîne contient en premier lieu une valeur numérique valide et ensuite seulement la convertir en un type numérique (par exemple, si vous devez manipuler des données provenant d'une base de données qui convertit les entiers en chaînes). Vous pouvez utiliser is_numeric()
puis floatval()
:
$a = "whatever"; // any variable
if (is_numeric($a))
var_dump(floatval($a)); // type is float
else
var_dump($a); // any type
Oui, il existe une méthode similaire en PHP, mais elle est si peu connue que vous en entendrez rarement parler. C'est un opérateur arithmétique appelé " identité ", comme décrit ici:
Pour convertir une chaîne numérique en nombre, procédez comme suit:
$a = +$a;
Voici la fonction qui réalise ce que vous recherchez. Nous vérifions d’abord si la valeur peut être comprise comme un nombre, si c’est le cas, nous la transformons en int et float. Si int et float sont identiques (par exemple, 5 == 5.0), nous renvoyons la valeur int. Si int et float ne sont pas identiques (par exemple, 5! = 5.3), nous supposons que vous avez besoin de la précision du float et renvoyez cette valeur. Si la valeur n'est pas numérique, un avertissement est renvoyé et la valeur null est renvoyée.
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;
}
}
Voici une fonction que j'ai écrite pour me simplifier les choses:
Il renvoie également des versions abrégées de boolean, integer, double et 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;
}
}
L'appel de type avec parseNumeric défini sur true convertira les chaînes numériques avant de vérifier le type.
Ainsi:
type ("5", true) retournera int
type ("3.7", true) retournera float
type ("500") retournera une chaîne
Soyez prudent, car il s’agit d’une sorte de méthode de vérification fausse et votre variable réelle sera toujours une chaîne. Si nécessaire, vous devrez convertir la variable réelle dans le type correct. J'en avais juste besoin pour vérifier si la base de données devait charger un identifiant d'élément ou un alias, afin de ne pas avoir d'effets inattendus puisqu'il sera analysé comme une chaîne au moment de l'exécution.
Éditer
Si vous souhaitez détecter si les objets sont des fonctions, ajoutez ce cas au commutateur:
case 'object': return is_callable($mixed)?'function':'object';
En plus de réponse de Boykodev Je suggère ceci:
Input Output
'2' * 1 2 (int)
'2.34' * 1 2.34 (float)
'0.3454545' * 1 0.3454545 (float)
$num = "3.14";
$int = (int)$num; // Output = 3
$float = (float)$num; // Output = 3.14
$double = (double)$num; // Output = 3.14
Vous pouvez convertir une chaîne en un nombre dans PHP à l'aide d'un transtypage.
J'ai trouvé qu'en JavaScript un moyen simple de convertir une chaîne en un nombre consiste à le multiplier par 1. Il résout le problème de la concaténation, car le symbole "+" a de multiples utilisations en JavaScript, tandis que le symbole "*" est purement pour la multiplication mathématique.
D'après ce que j'ai vu ici à propos de PHP vouloir automatiquement interpréter une chaîne contenant des chiffres comme un nombre (et les commentaires sur l'ajout, car dans PHP, le "+" est purement pour l'addition mathématique), cette astuce multipliée fonctionne très bien pour PHP, aussi.
Je l’ai testé et ça marche ... Bien que, selon la façon dont vous avez acquis la chaîne, vous souhaiterez peut-être lui appliquer la fonction trim (), avant de multiplier par 1.
Vous pouvez simplement écrire comme ceci:
<?php
$data = ["1","2","3","4","5"];
echo json_encode($data, JSON_NUMERIC_CHECK);
?>
Vous pouvez simplement utiliser la fonction intval()
pour convertir une chaîne en un entier.
$a = "10";
$b = (int)$a;
Vous pouvez utiliser ceci pour convertir une chaîne en un entier dans PHP .
Essayez d'utiliser quelque chose comme ça:
<?php
$string = '5'; // The $ string is a variable to hold string '5'
$int = intval($string); // $int is the converted string to integer $int = intval('5');
echo $int; // 5
?>
Vous pouvez utiliser:
((int) $var) ( but in big number it return 2147483647 :-) )
Mais la meilleure solution consiste à utiliser:
if (is_numeric($var))
$var = (isset($var)) ? $var : 0;
else
$var = 0;
Ou
if (is_numeric($var))
$var = (trim($var) == '') ? 0 : $var;
else
$var = 0;
Dans votre cas particulier, vous pouvez simplement multiplier par 1 pour convertir chaîne en nombre en PHP. PHP prend en charge automatiquement les nombres flottants et les nombres entiers.
$num = "2.12";
var_dump(is_float($num)); // bool(false)
var_dump(is_int($num)); // bool(false)
var_dump(is_string($num)); // bool(true)
$num = $num*1;
var_dump(is_float($num)); // bool(true)
var_dump(is_int($num)); // bool(false)
var_dump(is_string($num)); // bool(false)
PHP le fera pour vous dans les limites
<?php
$str = "3.148";
$num = $str;
printf("%f\n", $num);
?>
Vous pouvez changer le type de données comme suit
$number = "1.234";
echo gettype ($number) . "\n"; //Returns string
settype($number , "float");
echo gettype ($number) . "\n"; //Returns float
Pour des raisons historiques, "double" est renvoyé en cas de float.
Toutes les suggestions perdent le type numérique.
Cela me semble une meilleure pratique:
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";
}
Il y a un moyen:
$value = json_decode(json_encode($value, JSON_NUMERIC_CHECK|JSON_PRESERVE_ZERO_FRACTION|JSON_UNESCAPED_SLASHES), true);
Utiliser is_*
ne fonctionnera pas, car variable
est un: string
.
En utilisant la combinaison de json_encode()
et ensuite de json_decode()
, il est converti dans sa forme "vraie". Si c'est un vrai string
, alors cela produirait une erreur.
$num = "Me";
$int = (int)$num;
$float = (float)$num;
var_dump($num, $int, $float);
Affichera: string(2) "Me" int(0) float(0)
J'ai eu la question "disons que vous écriviez la fonction intégrée pour transformer un entier en chaîne en PHP, comment écririez-vous cette fonction" dans un entretien de programmation. Voici une 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);
J'ai lu les réponses et n'ai vu personne mentionner le plus gros inconvénient de la conversion de nombre de PHP.
La réponse la plus votée suggère de procéder comme suit:
$str = "3.14"
$intstr = (int)$str // now it's a number equal to 3
C'est brillant. PHP fait un casting direct. Mais si nous faisions ce qui suit?
$str = "3.14is_trash"
$intstr = (int)$str
Est-ce que PHP considère ces conversions comme valides?
Apparemment oui .
PHP lit la chaîne jusqu'à ce qu'il trouve le premier caractère non numérique du type requis. Cela signifie que pour les nombres entiers, les caractères numériques sont [0-9]. En conséquence, il lit 3
, puisqu'il se trouve dans la plage de caractères [0-9], il continue de lire. Lit .
et s’arrête là car il n’est pas compris dans la plage [0-9].
La même chose se produirait si vous deviez lancer pour flotter ou doubler. PHP lirait 3
, puis .
, puis 1
, puis 4
, et s'arrêterait à i
puisqu'il ne valait pas float caractère numérique.
Par conséquent, "million" >= 1000000
est évalué à false, mais "1000000million" >= 1000000
est évalué à true
.
Voir également:
https://www.php.net/manual/en/language.operators.comparison.php comment les conversions sont effectuées lors de la comparaison
https://www.php.net/manual/en/language.types.string.php#language.types.string.conversion comment les chaînes sont converties en nombres respectifs