J'ai le JS suivant incorporé dans une page:
var round = Math.round;
var id = $(this).attr("id");
var len = id.length;
var indexPos = len -1; // index of the number so that we can split this up and used it as a title
var pasType = id.substring(0, indexPos); // adult, child or infant
var ind = round(id.substring(indexPos)); // converts the string index to an integer
var number = (id.substring(indexPos) + 1); // creates the number that will go in the title
window.alert(number);
id
sera quelque chose comme adulte0, et je dois prendre cette chaîne et la scinder en adulte et 0 - cette partie fonctionne bien.
Le problème survient lorsque j'essaie d'incrémenter le 0. Comme vous pouvez le voir, j'utilise Math.round pour le convertir en entier, puis j'ajoute 1 - je m'attends à ce que 0 soit égal à 1 après cela. Cependant, il ne semble pas le convertir en entier, car je reçois 01
, pas 1
. Lorsque je teste ceci avec adult1, l'alerte que je reçois est 11
.
J'utilise this question pour référence, et j'ai aussi essayé var number += id.substring(indexPos);
, ce qui casse le JS (unexpected identifier '+='
)
Est-ce que quelqu'un sait ce que je fais mal? Existe-t-il une meilleure façon de le faire?
La fonction parseInt()
analyse une string
et renvoie une integer
, 10 étant le Radix ou la Base [DOC]
var number = parseInt(id.substring(indexPos) , 10 ) + 1;
Ceci est lié à l'opérateur +
in de JavaScript - si un nombre et une chaîne sont "additionnés", le nombre est converti en une chaîne:
0 + 1; //1
'0' + 1; // '01'
Pour résoudre ce problème, utilisez l'opérateur unaire +
ou parseInt()
:
+'0' + 1; // 1
parseInt('0', 10) + 1; // 1
L'opérateur unaire +
le convertit en un nombre (toutefois, s'il s'agit d'une décimale, il conservera les décimales), et parseInt()
se passe d'explication (se convertit en nombre, en ignorant les décimales).
Le deuxième argument est nécessaire pour que parseInt()
utilise la base correcte lorsque les 0 premiers sont placés:
parseInt('010'); // 8 in older browsers, 10 in newer browsers
parseInt('010', 10); // always 10 no matter what
Il existe également parseFloat()
si vous devez convertir les décimales en chaînes en valeur numérique - +
peut le faire aussi, mais cela se comporte légèrement différemment: c'est une autre histoire cependant.
JS pensera que le 0 est une chaîne, ce qu'il est en réalité, pour le convertir en int, utilisez la fonction: parseInt (), comme suit:
var numberAsInt = parseInt(number, 10);
// Second arg is radix, 10 is decimal.
Si le nombre ne peut pas être converti en un entier, il retournera NaN. Je recommanderais donc de vérifier cela aussi dans le code utilisé en production ou du moins si vous n'êtes pas sûr à 100% de l'entrée.
Utilisez parseInt ():
var number = (parseInt(id.substring(indexPos)) + 1);` // creates the number that will go in the title
Bien que parseInt
soit la fonction officielle pour ce faire, vous pouvez obtenir la même chose avec ce code:
number*1
L'avantage est que vous enregistrez certains caractères, ce qui peut permettre d'économiser de la bande passante si votre code prend en charge de nombreuses conversations de ce type.
Si vous êtes sûr que si chaîne (indexof) est un nombre, vous pouvez le faire comme suit
var number = Number(id.substring(indexPos)) + 1;
Sinon, je suggère de vérifier si la fonction Number est évaluée correctement.
Convertir par Number Class
: -
Par exemple:
var n = Number("103");
console.log(n+1)
Sortie: 104
Remarque: - Number
est class. Lorsque nous passons une chaîne, le constructeur de Number class
la convertira.