web-dev-qa-db-fra.com

Comment convertir une chaîne en un nombre en PHP?

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
563
Sara

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;
867
deceze

Il y a plusieurs façons de le faire:

  1. Convertissez les chaînes en types de données primitifs numériques:

    $num = (int) "10";
    $num = (double) "10.12"; // same as (float) "10.12";
    
  2. Effectuer des opérations mathématiques sur les chaînes:

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

    $num = intval("10");
    $num = floatval("10.1");
    
  4. Utilisez settype() .

146
fardjad

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.

45
Your Common Sense

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
?>
42
gopeca

Vous pouvez utiliser:

(int)(your value);

Ou vous pouvez utiliser:

intval(string)
22
noobie-php

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.

20
Aleksei Akireikin

Vous pouvez utiliser (int)_value_ par exemple.

$string = '100';
$int = (int)$string;

Voir Type Juggling .

14
Elbert Labasano

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)
14
Boykodev

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;
13
webNeat

Dans PHP , vous pouvez utiliser les fonctions intval(string) or floatval(string) pour convertir des chaînes en nombres.

12
Kashif Khan

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
10
taseenb

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:

opérateurs aritmétiques

Pour convertir une chaîne numérique en nombre, procédez comme suit:

$a = +$a;
9
aldemarcalazans

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;
    }
}
9
CogSciGradStudent

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';
6
Dieter Gribnitz

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)
6
drugan
    $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.

6
Sandun Harshana

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.

6
vernonner3voltazim

Vous pouvez simplement écrire comme ceci:

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

Vous pouvez simplement utiliser la fonction intval() pour convertir une chaîne en un entier.

5
Codemaker
$a = "10";

$b = (int)$a;

Vous pouvez utiliser ceci pour convertir une chaîne en un entier dans PHP .

4
Pritom

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
?>
4
Nikhil Jaitak

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;
4
Mehdi Ajdari

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)
3
Haktan Suren

PHP le fera pour vous dans les limites

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

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

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.

Documentation PHP

2
David Lozano

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";
}
2
Rocco Galasso

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)

1
Anuga

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);
0
Brendan

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

0
Dragas