Je veux convertir ces types de valeurs, '3'
, '2.34'
, '0.234343'
, etc. à un certain 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
Réponses:
Vous n'avez généralement pas besoin de le faire, car PHP contraindra le type pour vous dans la plupart des circonstances. Pour les situations où vous ne voulez convertir explicitement le type, coulé il:
la source
.
s'agit du séparateur de virgule décimale. en.wikipedia.org/wiki/…Il y a plusieurs façons de le faire:
Convertissez les chaînes en types de données primitifs numériques:
Effectuer des opérations mathématiques sur les chaînes:
Utilisez
intval()
oufloatval()
:Utilisez
settype()
.la source
(double)
n'est qu'un alias pour(float)
.$num = "10" + 1
exemple).intval("9999999999")==2147483647
.intval
est utile car vous pouvez alors l'utiliser dansarray_map('intval', $arrayOfStrings);
lequel vous ne pouvez pas faire de casting.$num = "10" + 1;
c'est mieux à utiliser$num = "10" * 1;
car cela ne changera pas la valeur (élément neutre de multiplication), c'est essentiellement quelque chose commetoNumber(..)
puisque le type final sera déterminé par ce qui est nécessaire pour convertir la chaîne "10" -> (int) 10; "10.1" -> (float) 10.1;Pour éviter les problèmes, essayez
intval($var)
. Quelques exemples:la source
12.7896
?(int)$my_str
cela ne fonctionnerait pas car je m'occupais spécifiquement des chaînes de caractères01
et013
que je voulais interpréter comme base 10 ... Je voulais donc un moyen de fournir explicitement la base.Dans n'importe quelle langue (typiquement lâche), vous pouvez toujours convertir une chaîne en un nombre en y ajoutant un zéro.
Cependant, cela n'a pas beaucoup de sens car PHP le fera automatiquement au moment de l'utilisation de cette variable, et il sera de toute façon converti 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 la conversion en flottant, il peut être modifié de manière imprévisible, en raison de la nature des nombres flottants.
la source
typeof('123'+0)
donne'string'
, car'123'+0
donne'1230'
.0+'123'
pour obtenir123
Vous pouvez utiliser:
Ou vous pouvez utiliser:
la source
is_float
, et si cela passe, transformez en avec(float)
au lieu de(int)
.Si vous voulez obtenir un flottant pour
$value = '0.4'
, mais int pour$value = '4'
, vous pouvez écrire:C'est un peu sale, mais ça marche.
la source
strpos($val, '.') === false ? intval($val) : floatval($val);
localeconv()['decimal_point']
place de'.'
. Un avantage de lastrpos
solution est qu'elle est presque 2x plus rapide que de lancer deux fois.2.1e2
, il a un point décimal, mais le nombre résultant est un entier+
opérateur d'identité:,var_dump(+'0.4', +'4')
vous donne un flottant et un int. php.net/manual/en/language.operators.arithmetic.phpVous pouvez toujours y ajouter zéro!
la source
A non well formed numeric value encountered
. une idée?Au lieu d'avoir à choisir de convertir le
string
enint
oufloat
, vous pouvez simplement y ajouter un0
, et PHP convertira automatiquement le résultat en type numérique.la source
En PHP, vous pouvez utiliser des
intval(string) or floatval(string)
fonctions pour convertir des chaînes en nombres.la source
Oui, il existe une méthode similaire en PHP, mais elle est si peu connue que vous en entendrez rarement parler. Il s'agit d'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:
la source
is_numeric
, ayez donc un endroit pour mettre du code pour gérer les chaînes qui ne peuvent pas être converties correctement.)Juste une petite note aux réponses qui peuvent être utiles et plus sûres dans certains cas. Vous voudrez peut-être vérifier si la chaîne contient réellement une valeur numérique valide en premier et ensuite 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()
puisfloatval()
:la source
Voici la fonction qui permet d'atteindre 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 en 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, nous lançons un avertissement et retournons null.
la source
J'ai trouvé qu'en JavaScript, un moyen simple de convertir une chaîne en nombre est de la multiplier par 1. Cela résout le problème de concaténation, car le symbole "+" a plusieurs utilisations en JavaScript, tandis que le symbole "*" est purement pour la multiplication mathématique.
Sur la base de ce que j'ai vu ici concernant PHP étant automatiquement disposé à interpréter une chaîne contenant des chiffres comme un nombre (et les commentaires sur l'ajout, car en PHP le "+" est purement pour l'addition mathématique), cette astuce de multiplication fonctionne très bien pour PHP, également.
Je l'ai testé et cela fonctionne ... Bien que selon la façon dont vous avez acquis la chaîne, vous souhaitiez peut-être lui appliquer la fonction trim (), avant de multiplier par 1.
la source
Voici une fonction que j'ai écrite pour me simplifier les choses:
Il renvoie également des versions abrégées de booléen, entier, double et réel.
L'appel de type avec parseNumeric défini sur true convertira les chaînes numériques avant de vérifier le type.
Donc:
type ("5", true) renverra int
type ("3.7", true) renverra float
type ("500") renverra une chaîne
Faites juste attention car c'est une sorte de méthode de fausse vérification et votre variable réelle sera toujours une chaîne. Vous devrez convertir la variable réelle au type correct si nécessaire. J'en avais juste besoin pour vérifier si la base de données doit charger un identifiant ou un alias d'élément, n'ayant donc aucun effet inattendu car il sera de toute façon analysé en tant que 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:
la source
En plus de la réponse de Boykodev, je suggère ceci:
la source
$id_cron = (string)date('YmdHi'); $target_id_cron = $id_cron - 1;
au lieu de $ target_id_cron = (int) $ id_cron - 1;A non well formed numeric value encountered
quand je veux changer la chaîne en float$num = '12,24' * 1
. Toute suggestion?Vous pouvez l'utiliser pour convertir une chaîne en entier en PHP .
la source
Vous pouvez simplement écrire comme ceci:
la source
Multipliez uniquement le nombre par 1 pour que la chaîne soit convertie en type nombre.
la source
Vous pouvez utiliser:
Mais la meilleure solution est d'utiliser:
Ou
la source
Vous pouvez modifier le type de données comme suit
Pour des raisons historiques, "double" est retourné en cas de flottement.
Documentation PHP
la source
Toutes les suggestions perdent le type numérique.
Cela me semble une meilleure pratique:
la source
PHP le fera pour vous dans certaines limites
la source
Il y a un moyen:
L' utilisation
is_*
ne fonctionnera pas, car levariable
est un:string
.En utilisant la combinaison de
json_encode()
puisjson_decode()
il est converti en sa forme "vraie". Si c'est un vrai,string
cela donnerait un mauvais résultat.Sortira:
string(2) "Me" int(0) float(0)
la source
J'ai eu la question "disons que vous écriviez la fonction intégrée pour convertir un entier en une chaîne en PHP, comment écririez-vous cette fonction" dans une interview de programmation. Voici une solution.
la source
J'ai lu les réponses et je n'ai vu personne mentionner la plus grande mise en garde dans la conversion des nombres PHP.
La réponse la plus votée suggère de faire ce qui suit:
C'est brillant. PHP fait du casting direct. Et si nous faisions ce qui suit?
PHP considère-t-il que ces conversions sont 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 entiers, les caractères numériques sont [0-9]. En conséquence, il lit
3
, puisqu'il est dans la plage de caractères [0-9], il continue la lecture. Lit.
et s'arrête là car il n'est pas dans la plage [0-9].La même chose se produirait si vous deviez lancer pour flotter ou doubler. PHP lirait
3
, puis.
, puis1
, puis4
s'arrêteraiti
car ce n'est pas un caractère numérique flottant valide.Par conséquent,
"million" >= 1000000
évalue à faux, mais"1000000million" >= 1000000
évalue à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
la source
Si vous ne savez pas à l'avance si vous avez un flottant ou un entier,
et si la chaîne peut contenir des caractères spéciaux (comme l'espace, €, etc.),
et si elle peut contenir plus d'un point ou une virgule,
vous pouvez utiliser ceci une fonction:
la source
Une approche différente:
json_encode($your_array, JSON_NUMERIC_CHECK);
éventuellement le décoderla source