Comment convertir une chaîne en entier en JavaScript?
javascript
string
integer
data-conversion
cubuspl42
la source
la source
Réponses:
La manière la plus simple serait d'utiliser la
Number
fonction native :Si cela ne fonctionne pas pour vous, il existe les méthodes parseInt , unary plus , parseFloat with floor et Math.round .
parseInt:
unaire plus si votre chaîne est déjà sous la forme d'un entier:
si votre chaîne est ou pourrait être un flottant et que vous voulez un entier:
ou, si vous utilisez plusieurs fois Math.floor:
Si vous êtes le type qui oublie de mettre la radix lorsque vous appelez parseInt, vous pouvez utiliser parseFloat et l'arrondir comme vous le souhaitez. Ici, j'utilise le sol.
Fait intéressant, Math.round (comme Math.floor) fera une conversion de chaîne en nombre, donc si vous voulez que le nombre soit arrondi (ou si vous avez un entier dans la chaîne), c'est un excellent moyen, peut-être mon préféré:
la source
'4'>>0
et'4'>>>0
.parseInt
etparseFloat
accepte heureusement des lettres. SeulementNumber
retourneNaN
régulièrement.NaN
pour chaque valeur qui n'est pas exactement un entier. Par conséquent, aucun de ces éléments ne fonctionne comme uneNumber('2.2')
contrainte2
et uneNumber('')
contrainte à 0.Essayez la fonction parseInt:
Mais il y a un problème. Si vous essayez de convertir "010" en utilisant la fonction parseInt, il détecte comme nombre octal et renverra le numéro 8. Donc, vous devez spécifier un radix (de 2 à 36). Dans ce cas, la base 10.
Exemple:
Notez
parseInt
qu'ignore les mauvaises données après avoir analysé tout ce qui est valide.Ce guide analysera 51:
la source
parseInt('0asdf', 10)
produit0
.Il existe deux façons principales de convertir une chaîne en nombre en javascript. Une façon consiste à l'analyser et l'autre consiste à changer son type en nombre. Toutes les astuces des autres réponses (par exemple, unaire plus) impliquent de contraindre implicitement le type de la chaîne à un nombre. Vous pouvez également faire la même chose explicitement avec la fonction Number.
Analyse
parseInt et parseFloat sont les deux fonctions utilisées pour analyser les chaînes en nombres. L'analyse s'arrêtera silencieusement si elle frappe un caractère qu'il ne reconnaît pas, ce qui peut être utile pour analyser des chaînes comme "92px", mais c'est aussi quelque peu dangereux, car il ne vous donnera aucune sorte d'erreur sur une mauvaise entrée, à la place vous récupérera NaN à moins que la chaîne ne commence par un nombre. Les espaces au début de la chaîne sont ignorés. Voici un exemple montrant qu'il fait quelque chose de différent de ce que vous voulez et ne donne aucune indication que quelque chose s'est mal passé:
Il est recommandé de toujours spécifier le radix comme deuxième argument. Dans les navigateurs plus anciens, si la chaîne commençait par un 0, elle serait interprétée comme octale si le radix n'était pas spécifié, ce qui prenait beaucoup de monde par surprise. Le comportement pour hexadécimal est déclenché en faisant commencer la chaîne par 0x si aucun radix n'est spécifié, par exemple
0xff
. La norme a en fait changé avec ecmascript 5, donc les navigateurs modernes ne déclenchent plus d'octal quand il y a un 0 en tête si aucun radix n'a été spécifié. parseInt comprend les radix jusqu'à la base 36, auquel cas les majuscules et les minuscules sont traitées comme équivalentes.Changer le type d'une chaîne en nombre
Toutes les autres astuces mentionnées ci-dessus qui n'utilisent pas parseInt impliquent de forcer implicitement la chaîne en un nombre. Je préfère le faire explicitement,
Cela a un comportement différent des méthodes d'analyse (bien qu'il ignore toujours les espaces blancs). C'est plus strict: s'il ne comprend pas la totalité de la chaîne qu'il ne retourne
NaN
, vous ne pouvez donc pas l'utiliser pour des chaînes comme97px
. Puisque vous voulez un nombre primitif plutôt qu'un objet wrapper Number, assurez-vous de ne pas le placernew
devant la fonction Number.Évidemment, la conversion en un nombre vous donne une valeur qui peut être un flottant plutôt qu'un entier, donc si vous voulez un entier, vous devez le modifier. Il existe plusieurs façons de procéder:
Tout opérateur au niveau du bit (ici, j'ai fait un bitwise ou, mais vous pouvez également faire une double négation comme dans une réponse précédente ou un décalage de bits) convertira la valeur en un entier 32 bits, et la plupart d'entre eux se convertiront en un entier signé. Notez que cela ne vous donnera pas envie de gros nombres entiers . Si l'entier ne peut pas être représenté en 32 bits, il sera encapsulé.
Pour travailler correctement avec des nombres plus importants, vous devez utiliser les méthodes d'arrondi
Gardez à l' esprit que toutes ces méthodes comprennent la notation exponentielle, donc
2e2
est200
plutôt que NaN. De plus, Number comprend "Infinity", contrairement aux méthodes d'analyse.Douane
Il est peu probable que l'une de ces méthodes fasse exactement ce que vous voulez. Par exemple, je voudrais généralement qu'une erreur soit renvoyée si l'analyse échoue, et je n'ai pas besoin de la prise en charge d'Infinity, des exponentielles ou des espaces blancs de tête. Selon votre cas d'utilisation, il est parfois judicieux d'écrire une fonction de conversion personnalisée.
Vérifiez toujours que la sortie de Number ou l'une des méthodes d'analyse est le type de nombre que vous attendez. Vous voudrez certainement utiliser
isNaN
pour vous assurer que le nombre n'est pas NaN (généralement la seule façon de savoir que l'analyse a échoué).la source
97,8,00
et similaire ou non. Une astuce simple consiste à faire un.replace(/[^0-9]/g, "")
qui supprimera tous les non chiffres de votre chaîne, puis effectuera la conversion par la suite. Bien sûr, cela ignorera toutes sortes de chaînes folles sur lesquelles vous devriez probablement faire une erreur plutôt que de simplement analyser ....replace(/[^0-9.]/g, "")
, sinon "1.05" deviendra "105".var fixed = Number("97.654").toFixed(0); // rounded rather than truncated
, nous obtenons unstring
(à cause de la.toFixed
méthode) au lieu d'unnumber
(entier). Si nous voulons l'entier arrondi, il vaut probablement mieux utiliser simplementMath.round("97.654");
ParseInt () et + sont différents
la source
C'est une vieille question, mais cela peut être utile à quelqu'un.
J'utilise cette façon de convertir la chaîne en nombre
entierAinsi, lors de la multiplication par 1, la valeur ne change pas, mais js renvoie automatiquement un nombre.
Mais comme indiqué ci-dessous, cela devrait être utilisé si vous êtes sûr que le
str
est un nombre (ou peut être représenté comme un nombre), sinon il renverra NaN - pas un nombre.vous pouvez créer une fonction simple à utiliser, par exemple
la source
Le plus rapide
Tester
Voici une petite comparaison de vitesse (Mac Os uniquement) ... :)
Pour le chrome «plus» et «mul» sont les plus rapides (> 700 000,00 op / sec), «Math.floor» est le plus lent. Pour Firefox, «plus» est le plus lent (!) «Mul» est le plus rapide (> 900 000 000 op / sec). Dans Safari, "parseInt" est des jeûnes, "nombre" est le plus lent (mais les résultats sont assez similaires,> 13 000 000 <31 000 000). Donc, Safari pour la chaîne cast en int est plus de 10 fois plus lent que les autres navigateurs. Le gagnant est donc ' mul ' :)
Vous pouvez l'exécuter sur votre navigateur par ce lien https://jsperf.com/js-cast-str-to-number/1
Mise à jour
Je teste également
var x = ~~"1000";
- sur Chrome et Safari est un peu plus lent quevar x = "1000"*1
(<1%), sur Firefox est un peu plus rapide (<1%). Je mets à jour l'image ci-dessus et testela source
Essayez parseInt.
la source
J'ai posté la mauvaise réponse ici, désolé. fixé.
C'est une vieille question, mais j'adore cette astuce:
Le double négatif au niveau du bit supprime tout ce qui suit le séparateur décimal ET le convertit en un format numérique. On m'a dit que c'est un peu plus rapide que d'appeler des fonctions et ainsi de suite, mais je ne suis pas entièrement convaincu.
EDIT: Une autre méthode que je viens de voir ici (une question sur l'opérateur javascript >>>, qui est un décalage vers la droite de remplissage nul) qui montre que le décalage d'un nombre de 0 avec cet opérateur convertit le nombre en uint32, ce qui est bien si vous veulent également qu'il ne soit pas signé . Encore une fois, cela se convertit en un entier non signé , ce qui peut conduire à des comportements étranges si vous utilisez un numéro signé.
la source
Attention si vous utilisez parseInt pour convertir un flotteur en notation scientifique! Par exemple:
aura pour résultat
au lieu de
la source
parseInt
ne fonctionnerait pas correctement pour un flotteur.parseFloat
fonctionne correctement dans ce cas.Pour convertir une chaîne en entier, je recommande d'utiliser parseFloat et NOT parseInt. Voici pourquoi:
Utilisation de parseFloat:
Utilisation de parseInt:
Donc, si vous avez remarqué que parseInt supprime les valeurs après les décimales, alors que parseFloat vous permet de travailler avec des nombres à virgule flottante et donc plus approprié si vous souhaitez conserver les valeurs après les décimales. Utilisez parseInt si et seulement si vous êtes sûr de vouloir la valeur entière.
la source
Également comme remarque: Mootools a la fonction toInt () qui est utilisée sur n'importe quelle chaîne native (ou float (ou entier)).
la source
SyntaxError
, vous devez utiliser un double point, par exemple:2..toInt();
le premier point mettra fin à la représentation d'unNumber
littéral et le deuxième point est l'accesseur de propriété.Veuillez voir l'exemple ci-dessous qui vous aidera à lever votre doute
en utilisant la fonction parseint Il ne donnera que l'op du nombre entier présent et non la chaîne
la source
nous pouvons utiliser
+(stringOfNumber)
au lieu d'utiliserparseInt(stringOfNumber)
Ex:
+("21")
retourne un entier de 21 comme leparseInt("21")
.nous pouvons aussi utiliser cet opérateur unaire "+" pour analyser float ...
la source
+
?parseInt
. Une implémentation couranteconst myNumber = +myNumberAsAString
ressemble à un standard+=
ou à un=+
opérateur à première vue. En outre, s'il est utilisé de manière incorrecte, il peut entraîner des erreurs de concaténation. Cette solution est basée sur le fait que 0 est considéré comme le côté gauche quand aucun nombre n'est fourni.Essayez
str - 0
de vous convertirstring
ennumber
.Voici deux liens pour comparer les performances de plusieurs façons de convertir une chaîne en entier
https://jsperf.com/number-vs-parseint-vs-plus
http://phrogz.net/js/string_to_number.html
la source
'1'
sera converti en1
parToNumber
,1 - 0
serait alors1
Il existe de nombreuses façons en JavaScript de convertir une chaîne en une valeur numérique ... Tout simple et pratique, choisissez la façon dont on travaille pour vous:
Aussi tous les mathématiques opération les convertit également en nombre, par exemple ...
Ma façon préférée utilise le
+
signe, qui est la manière élégante de convertir une chaîne en nombre en JavaScript.la source
Google m'a donné cette réponse comme résultat, alors ...
J'avais en fait besoin de "sauvegarder" une chaîne sous forme d'entier, pour une liaison entre C et JavaScript, donc je convertis la chaîne en une valeur entière:
la source
int2str
fonction s'arrête si un octet est égal à 0, ce qui pourrait être un élément légitime dans la valeur, donc leif
...break
devrait être supprimé afin que vous obteniez une valeur complète de 4 octets retournée.À mon avis, aucune réponse ne couvre tous les cas marginaux car l'analyse d'un flottant devrait entraîner une erreur.
la source
parseInteger
pas le casparseNumber
. Je suppose que toutes les solutions sont une solution de contournement puisque JS ne prend pas en charge les entiers et les flottants en tant que types distincts. Nous pourrions revenirnull
au lieu deNaN
, si Not A Number est trompeur.Voici la solution la plus simple
Solution plus simple
la source
Toutes les réponses sont bonnes. Veuillez vous assurer avant que ce soit un nombre dans une chaîne en faisant "typeot x === 'nombre'" sinon il renverra NaN
la source
var num1 = "12423"; typeof num1;
retournestring
.Une autre option consiste à doubler XOR la valeur avec elle-même:
Cela produira:
la source
Je n'ai ajouté qu'un plus (+) avant la chaîne et c'était la solution!
J'espère que cela aide ;)
la source
Additionnant la multiplication des chiffres avec leur puissance respective de dix:
soit: 123 = 100 + 20 + 3 = 1 * 100 + 2 + 10 + 3 * 1 = 1 * (10 ^ 2) + 2 * (10 ^ 1) + 3 * (10 ^ 0)
}
la source
la source
J'utilise ceci
de cette façon, je reçois toujours un int.
la source
Le moyen le plus sûr de vous assurer d'obtenir un entier valide:
Exemples:
la source
la source
vous pouvez utiliser plus, par exemple =>
var personAge = '24'; var personAge1 = (+ personAge)
alors vous pouvez voir le type de personne
la source