Conversion de chaînes et de nombres JavaScript

89

Comment puis-je effectuer les opérations suivantes en JavaScript?

  1. Concaténer «1», «2», «3» en «123»

  2. Convertir "123" en 123

  3. Ajouter 123 + 100 = 223

  4. Cacher 223 dans "223"

user366312
la source
42
Presque tous les livres JavaScript que j'ai lus traitent de ces problèmes. Mais ça va. Répondre aux questions est l'essence même de StackOverflow. @Shadi Almosri - SO a une règle "ne soyez pas méchant". Je ne vois pas l'utilité de rabaisser les gens qui posent des questions ici, puisque c'est le but du lieu.
Nosredna
4
@Nosredna: je comprends parfaitement poser des questions, je n'aime rien de plus que d'y répondre, mais je pense que montrer le fait que vous avez essayé est une meilleure étiquette que d'attendre simplement une réponse et aussi mieux pour une expérience personnelle d'apprentissage. Juste mon avis, n'essaie pas d'être méchant! :)
Shadi Almosri
1
@Shadi, alors comment la question aurait-elle dû être posée? Avec une déclaration d'avoir déjà cherché la réponse?
Nosredna
1
Cela m'a semblé être une sorte de devoir quand je l'ai vu pour la première fois, mais en le relisant, je ne le pensais pas, cela ressemblait à quelqu'un qui expérimentait JavaScript et obtenait des résultats inattendus et voulait le clouer. Cela dit, je me demande si le stackoverflow.com/faq pourrait inclure quelque chose comme un code d'honneur pour les étudiants. Nous sommes en quelque sorte une université mondiale ici, et je ne pense pas que ce soit fou d'essayer de comprendre ce que pourrait être un ensemble d'éthique pour cet endroit. Ou peut-être que c'est fou. :-)
artlung
6
@Shadi, eh bien, du côté positif, la question et la réponse sont dans StackOverflow et, espérons-le, aideront d'autres personnes. Je vois que les gens restent bloqués sur ce genre de choses tout le temps, surtout lorsqu'ils viennent de langages comme Java. Il y a une raison pour laquelle les gens demandent cela encore et encore - c'est parce qu'ils PENSENT savoir comment fonctionnent les expressions en JavaScript, mais ce n'est pas le cas. Ils font des hypothèses basées sur l'expérience en dehors de JS. C'est pourquoi il est si utile d'essayer quelques tests simples en ajoutant des chaînes et des nombres, et en essayant unaire plus et moins.
Nosredna

Réponses:

120

Vous souhaitez vous familiariser avec parseInt()et toString().

Et utile dans votre boîte à outils sera de regarder une variable pour savoir de quel type il s'agit - typeof:

<script type="text/javascript">
    /**
     * print out the value and the type of the variable passed in
     */

    function printWithType(val) {
        document.write('<pre>');
        document.write(val);
        document.write(' ');
        document.writeln(typeof val);
        document.write('</pre>');
    }

    var a = "1", b = "2", c = "3", result;

    // Step (1) Concatenate "1", "2", "3" into "123"
    // - concatenation operator is just "+", as long
    //   as all the items are strings, this works
    result = a + b + c;
    printWithType(result); //123 string

    // - If they were not strings you could do
    result = a.toString() + b.toString() + c.toString();
    printWithType(result); // 123 string

    // Step (2) Convert "123" into 123
    result = parseInt(result,10);
    printWithType(result); // 123 number

    // Step (3) Add 123 + 100 = 223
    result = result + 100;
    printWithType(result); // 223 number

    // Step (4) Convert 223 into "223"
    result = result.toString(); //
    printWithType(result); // 223 string

    // If you concatenate a number with a 
    // blank string, you get a string    
    result = result + "";
    printWithType(result); //223 string
</script>
artlung
la source
Une raison particulière pour laquelle vous mettez cela dans les balises de script?
Julix
@Julix Pour les novices en 2009, plonger dans un fichier html pour apprendre un concept de base. Si je répondais à cette nouvelle aujourd'hui, je pourrais le faire différemment, mais peut-être pas.
artlung
53

Étape (1) Concaténer «1», «2», «3» en «123»

 "1" + "2" + "3"

ou

 ["1", "2", "3"].join("")

La méthode join concatène les éléments d'un tableau dans une chaîne, en plaçant le délimiteur spécifié entre les éléments. Dans ce cas, le "délimiteur" est une chaîne vide ( "").


Étape (2) Convertissez "123" en 123

 parseInt("123")

Avant ECMAScript 5 , il était nécessaire de passer la base pour la base 10:parseInt("123", 10)


Étape (3) Ajouter 123 + 100 = 223

 123 + 100


Étape (4) Cachez 223 dans "223"

 (223).toString() 


Mettez tout en place

 (parseInt("1" + "2" + "3") + 100).toString()

ou

 (parseInt(["1", "2", "3"].join("")) + 100).toString()
Patrick McElhaney
la source
4
Bel exemple clair. Aussi, bravo pour la bonne forme - vous devez toujours spécifier la base de la parseIntfonction .
hotshot309
Y compris le radix m'a confondu et j'ai fait défiler jusqu'à une autre réponse où elle a été expliquée. Édité dans une explication rapide pour être juste au point de confusion.
ArtOfWarfare
@ArtOfWarfare Merci, bonne modification. La base était nécessaire au moment de cette réponse. Ces jours-ci, je peux me disputer pour ne pas le faire. Depuis ES5, que tous les navigateurs «modernes» et Node.js prennent en charge, parseInt (<a chaîne avec seulement 0-9>) utilise toujours la base 10.
Patrick McElhaney
fait amusant .. dans le JavaScript original de Netscape (vers 1995), la base par défaut pour parseInt était 8 (à moins que la chaîne contienne un 8 ou un 9)
Justin Ohms
26
r = ("1"+"2"+"3")           // step1 | build string ==> "123"
r = +r                      // step2 | to number    ==> 123
r = r+100                   // step3 | +100         ==> 223
r = ""+r                    // step4 | to string    ==> "223"

//in one line
r = ""+(+("1"+"2"+"3")+100);
Cesarl
la source
Merci pour la chaîne rapide -> conversion de nombre
mcont
Si vous vérifiez qu'il s'agit d'un nombre ou non, utilisez parseInt (). Par exemple, parseInt ("") est NaN, mais + "" est 0!
greene
15

Ces questions reviennent tout le temps en raison du système de saisie de JavaScript. Les gens pensent qu'ils obtiennent un nombre lorsqu'ils obtiennent la chaîne d'un nombre.

Voici quelques éléments que vous pourriez voir qui tirent parti de la façon dont JavaScript traite les chaînes et les nombres. Personnellement, j'aurais aimé que JavaScript utilise un symbole autre que + pour la concaténation de chaînes.

Étape (1) Concaténer «1», «2», «3» en «123»

result = "1" + "2" + "3";

Étape (2) Convertissez "123" en 123

result = +"123";

Étape (3) Ajouter 123 + 100 = 223

result = 123 + 100;

Étape (4) Convertissez 223 en «223»

result = "" + 223;

Si vous savez POURQUOI cela fonctionne, vous êtes moins susceptible d'avoir des problèmes avec les expressions JavaScript.

Nosredna
la source
3
Je pense en fait que c'est une pratique extrêmement mauvaise car elle est assez opaque quant à ce qui se passe. Savoir que certaines opérations affectent un cast implicite est une astuce, et une bonne chose à savoir, mais ce n'est pas du tout lisible. La communication est tout.
annakata le
1
Je pense qu'il est important de connaître ces choses PRÉCISÉMENT afin que vous sachiez ce qui se passe lorsque vous lisez du code. Beaucoup de JavaScript est laconique car il est transmis en tant que source, et un petit code peut signifier une réduction des coûts du serveur.
Nosredna
6
Vous devriez cependant y parvenir grâce à des outils de compression, sous cette forme, il s'agit d'une optimisation à un coût de maintenance très réel.
annakata le
6
Pourtant, connaître ces choses aiderait à éviter la question en premier lieu, qui était un manque de connaissances sur la façon dont JavaScript traite les chaînes et les nombres. C'est une question de curiosité intellectuelle. Que se passe-t-il lorsque j'ajoute un nombre à une chaîne? Comment fonctionne unaire plus? Si vous ne connaissez pas les réponses, vous ne connaissez pas vraiment JavaScript, et ce genre de questions se posera.
Nosredna
11

Vous pouvez le faire comme ceci:

// step 1 
var one = "1" + "2" + "3"; // string value "123"

// step 2
var two = parseInt(one); // integer value 123

// step 3
var three = 123 + 100; // integer value 223

// step 4
var four = three.toString(); // string value "223"
Andrew Hare
la source
16
La meilleure pratique consiste à ajouter le paramètre radix à la fonction parseInt (). ainsi, parseInt (un, 10) garantit que tout ce que vous lui lancez ne sera pas mal converti.
artlung
3
D'accord. Sinon, les valeurs commençant par 0seront considérées comme des nombres octaux (base 8) .
hotshot309
1
Encore plus inattendu, les valeurs commençant par 0et contenant 8ou 9échoueront, conduisant à un retour de 0. Par exemple,, parseInt('034') = 28et parseInt('09') = 0.
Robert Martin du
9

Pour convertir une chaîne en nombre, soustrayez 0. Pour convertir un nombre en chaîne, ajoutez "" (la chaîne vide).

5 + 1 vous donneront 6

(5 + "") + 1 vous donnera "51"

("5" - 0) + 1 vous donnera 6

Robert L
la source
1
S'appuyer sur des astuces basées sur des bizarreries linguistiques comme celle-ci peut conduire à une véritable obscurité. Par exemple, "5" -0 produit effectivement le chiffre 5, mais "5" +0 donne la chaîne "50". (Oui, je sais que c'est plusieurs années plus tard et c'est probablement un peu triste que je lisais même ceci.)
Nick Rice
6

parseInt est défectueux comme scanf:

parseInt ("12 singes", 10) est un nombre avec la valeur '12'
+ "12 singes" est un nombre avec la valeur 'NaN'
Number ("12 monkeys") est un nombre avec la valeur "NaN"

xander
la source
1

Voici un exemple très irritant de la façon dont JavaScript peut vous causer des problèmes:

Si vous essayez simplement d'utiliser parseInt()pour convertir en nombre, puis ajoutez un autre nombre au résultat, il concaténera deux chaînes.

Cependant, vous pouvez résoudre le problème en plaçant l'expression de somme entre parenthèses, comme illustré dans l'exemple ci-dessous.

Résultat: leur âge total est de: 98 ans; Leur âge total n'est PAS: 5048

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
function Person(first, last, age, eye) {
    this.firstName = first;
    this.lastName = last;
    this.age = age;
    this.eyeColor = eye;
}

var myFather = new Person("John", "Doe", "50", "blue");
var myMother = new Person("Sally", "Rally", 48, "green");

document.getElementById("demo").innerHTML = "Their age sum is: "+
 (parseInt(myFather.age)+myMother.age)+"; Their age sum is NOT: " +
 parseInt(myFather.age)+myMother.age; 
</script>

</body>
</html>

jpsousa
la source
0

Le plus simple est lorsque vous voulez faire d'un entier une chaîne

var a,b, c;
a = 1;
b = a.toString(); // This will give you string

Maintenant, à partir de la variable b qui est de type string, nous pouvons obtenir l'entier

c = b *1; //This will give you integer value of number :-)

Si vous voulez vérifier ci-dessus, c'est un nombre. Si vous n'êtes pas sûr que b contient un entier, vous pouvez utiliser

if(isNaN(c*1)) {
  //NOt a number
}
else //number
Kshitiz
la source
0

Nous pouvons le faire en utilisant l' opérateur unaire plus pour les convertir d'abord en nombres et simplement les ajouter. voir ci-dessous:-

var a = "4";
var b = "7";
var sum = +a + +b; 
singhkumarhemant
la source