Question Comment puis-je convertir une chaîne en un entier en JavaScript?


Comment puis-je convertir un string dans un integer en JavaScript?


1372
2017-07-15 20:22


origine


Réponses:


Le plus simple serait d'utiliser le natif Number fonction:

var x = Number("1000")

Si cela ne fonctionne pas pour vous, alors il y a parseInt, unaire plus, parseFloat avec plancher, et Math.round méthodes

parseInt:

var x = parseInt("1000", 10); // you want to use radix 10
    // so you get a decimal number even with a leading 0 and an old browser ([IE8, Firefox 20, Chrome 22 and older][1])

unaire plus si votre chaîne est déjà sous la forme d'un entier:

var x = +"1000";

si votre chaîne est ou pourrait être un float et que vous voulez un entier:

var x = Math.floor("1000.01"); //floor automatically converts string to number

ou, si vous allez utiliser Math.floor plusieurs fois:

var floor = Math.floor;
var x = floor("1000.01");

Si vous êtes du type qui oublie de mettre la base lorsque vous appelez parseInt, vous pouvez utiliser parseFloat et l'arrondir comme bon vous semble. Ici, j'utilise le sol.

var floor = Math.floor;
var x = floor(parseFloat("1000.01"));

Fait intéressant, Math.round (comme Math.floor) fera une chaîne de conversion de nombre, donc si vous voulez arrondir le nombre (ou si vous avez un entier dans la chaîne), c'est un excellent moyen, peut-être mon préféré:

var round = Math.round;
var x = round("1000"); //equivalent to round("1000",0)

1747
2017-07-15 20:28



Essayez la fonction parseInt:

var number = parseInt("10");

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 une base (de 2 à 36). Dans ce cas, base 10.

parseInt(string, radix)

Exemple:

var result = parseInt("010", 10) == 10; // Returns true

var result = parseInt("010") == 10; // Returns false

192
2017-07-15 20:23



Il y a deux façons principales de convertir une chaîne en un nombre en javascript. L'une consiste à l'analyser et l'autre à changer son type en nombre. Toutes les astuces dans les autres réponses (par exemple unaire plus) impliquent implicitement de contraindre le type de la chaîne à un nombre. Vous pouvez également faire la même chose explicitement avec la fonction Number.

Parsing

var parsed = parseInt("97", 10);

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'elle ne reconnaît pas, ce qui peut être utile pour analyser des chaînes comme "92px", mais c'est aussi un peu dangereux, car cela ne vous donnera pas d'erreur sur les mauvaises entrées. Je récupérerai NaN sauf si la chaîne commence par un nombre. Les espaces au début de la chaîne sont ignorés. Voici un exemple de cela qui fait quelque chose de différent de ce que vous voulez, et qui ne donne aucune indication que quelque chose s'est mal passé:

var widgetsSold = parseInt("97,800", 10); // widgetsSold is now 97

C'est une bonne pratique de toujours spécifier la base comme deuxième argument. Dans les anciens navigateurs, si la chaîne commençait par un 0, elle serait interprétée comme octale si la base n'était pas spécifiée, ce qui a pris beaucoup de gens par surprise. Le comportement pour hexadécimal est déclenché en ayant la chaîne commence par 0x si aucune base n'est spécifiée, par ex. 0xff. La norme a effectivement changé avec ecmascript 5, de sorte que les navigateurs modernes ne déclenchent plus octal quand il y a un 0 principal si aucune base n'a été spécifiée. ParseInt comprend les radix jusqu'à la base 36, auquel cas les majuscules et les minuscules sont considérées comme équivalentes.

Changer le type d'une chaîne en un nombre

Toutes les autres astuces mentionnées ci-dessus qui n'utilisent pas parseInt impliquent implicitement la contrainte de la chaîne dans un nombre. Je préfère le faire explicitement,

var cast = Number("97");

Cela a un comportement différent pour les méthodes d'analyse (bien qu'il ignore toujours les espaces). C'est plus strict: s'il ne comprend pas l'ensemble de la chaîne, il revient NaN, donc vous ne pouvez pas l'utiliser pour des chaînes comme 97px. Puisque vous voulez un nombre primitif plutôt qu'un objet wrapper Number, assurez-vous de ne pas mettre new devant la fonction Number.

Évidemment, la conversion en un nombre vous donne une valeur qui pourrait être un flottant plutôt qu'un entier, donc si vous voulez un entier, vous devez le modifier. Il y a plusieurs façons de le faire:

var rounded = Math.floor(Number("97.654"));  // other options are Math.ceil, Math.round
var fixed = Number("97.654").toFixed(0); // rounded rather than truncated
var bitwised = Number("97.654")|0;  // do not use for large numbers

N'importe quel opérateur au niveau du bit (ici j'ai fait un bit ou bien, mais vous pouvez aussi faire une double négation comme dans une réponse précédente ou un bitshift) convertira la valeur en un entier 32bits, et la plupart convertiront en un entier signé. Notez que ceci ne veut pas que vous voulez pour les grands entiers. Si l'entier ne peut pas être représenté en 32 bits, il s'enroulera.

~~"3000000000.654" === -1294967296
// This is the same as
Number("3000000000.654")|0
"3000000000.654" >>> 0 === 3000000000 // unsigned right shift gives you an extra bit
"300000000000.654" >>> 0 === 3647256576 // but still fails with larger numbers

Pour fonctionner correctement avec des nombres plus grands, vous devez utiliser les méthodes d'arrondi

Math.floor("3000000000.654") === 3000000000
// This is the same as
Math.floor(Number("3000000000.654"))

Gardez à l'esprit que toutes ces méthodes comprennent la notation exponentielle, donc 2e2 est 200 plutôt que NaN. En outre, Number comprend "Infinity", tandis que les méthodes d'analyse ne le font pas.

Douane

Il est peu probable que l'une ou l'autre de ces méthodes fasse exactement ce que vous voulez. Par exemple, je voudrais généralement qu'une erreur se produise si l'analyse échoue, et je n'ai pas besoin de support pour l'infini, les exponentielles ou les espaces blancs. En fonction de votre 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 numéro n'est pas NaN (généralement la seule façon de découvrir que l'analyse a échoué).


107
2017-12-11 07:47



ParseInt () et + sont différents

parseInt("10.3456") // returns 10

+"10.3456" // returns 10.3456

50
2018-03-14 09:54



Bien qu'une vieille question, mais peut-être cela peut être utile à quelqu'un.

J'utilise cette façon de convertir la chaîne en int nombre

var str = "25";       // string
var number = str*1;   // number

Donc, en multipliant par 1, la valeur ne change pas, mais js renvoie automatiquement un nombre.

Mais comme il est montré 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 ex.

function toNumber(str) {
   return str*1;
}

enter image description here


35
2018-03-16 18:24



Essayez parseInt.

var number = parseInt("10", 10); //number will have value of 10.

31
2017-07-15 20:23



J'ai posté la mauvaise réponse ici, désolé. fixé.

C'est une vieille question, mais j'aime cette astuce:

~~"2.123"; //2
~~"5"; //5

Le double bit négatif supprime tout ce qui suit le point décimal et le convertit en un format numérique. On m'a dit que c'est un peu plus rapide que les fonctions d'appel et autres joyeusetés, mais je ne suis pas entièrement convaincu.

EDIT: Une autre méthode que je viens de voir ici (une question à propos de l'opérateur javascript >>>, qui est un décalage de droite à zéro) qui montre que le décalage d'un nombre par 0 avec cet opérateur convertit le nombre en un uint32 ce qui est bien si tu le veux aussi non signé. Encore une fois, cela se transforme en entier non signé, ce qui peut conduire à des comportements étranges si vous utilisez un numéro signé.

"-2.123" >>> 0; // 4294967294
"2.123" >>> 0; // 2
"-5" >>> 0; // 4294967291
"5" >>> 0; // 5

25
2018-01-16 09:51



Attention si vous utilisez parseInt pour convertir un flottant en notation scientifique! Par exemple:

parseInt("5.6e-14") 

aura pour résultat

5 

au lieu de

0

18
2017-07-01 06:48



Aussi en note: Mootools a la fonction toInt () qui est utilisée sur n'importe quelle chaîne native (ou float (ou entier)).

"2".toInt()   // 2
"2px".toInt() // 2
2.toInt()     // 2

16
2017-07-16 20:05



Voici une petite comparaison de vitesse (Mac Os seulement) ... :)

Pour chrome 'plus' et 'mul' sont les plus rapides, 'Math.floor' est plus lent (> 700,000,00 op / sec). Pour Firefox 'plus' est le plus lent (!) 'Mul' est le plus rapide (> 900 000 000 op / sec). Dans Safari 'parseInt' est fastes, 'number' est le plus lent (mais les résultats sont assez similaires,> 13,000,000 <31,000,000). Donc, Safari pour la chaîne cast à int est plus de 10 fois plus lent que les autres navigateurs. Donc le gagnant est 'mul':)

Vous pouvez l'exécuter sur votre navigateur par ce lien https://jsperf.com/casttonumber

enter image description here


16
2018-03-27 21:42