Conversione di stringhe e numeri JavaScript


89

Come posso fare quanto segue in JavaScript?

  1. Concatena "1", "2", "3" in "123"

  2. Converti "123" in 123

  3. Aggiungi 123 + 100 = 223

  4. Trasforma 223 in "223"


42
Quasi tutti i libri JavaScript che ho letto trattano questi problemi. Ma va bene. Rispondere alle domande è lo scopo di StackOverflow. @ Shadi Almosri - SO ha una regola del "non essere meschino". Non vedo il motivo di sminuire le persone che fanno domande qui, poiché questo è il punto del posto.
Nosredna,

4
@Nosredna: capisco perfettamente fare domande, non amo nient'altro che rispondere, ma penso che mostrare il fatto che hai provato sia migliore etichetta che aspettarsi semplicemente una risposta e anche meglio per un'esperienza personale di apprendimento. Solo la mia opinione, non cercare di essere cattivo! :)
Shadi Almosri

1
@ Shadi, quindi come avrebbe dovuto essere posta la domanda? Con la dichiarazione di aver già cercato la risposta?
Nosredna,

1
Quando l'ho visto per la prima volta mi è sembrato un compito da casa, ma quando l'ho riletto ho pensato di no, sembrava che qualcuno stesse sperimentando in JavaScript e ottenendo risultati inaspettati e volendo inchiodarlo. Detto questo, mi chiedo se stackoverflow.com/faq potrebbe includere qualcosa come un codice d'onore per gli studenti. Siamo una specie di università globale qui, e non penso che sia assurdo cercare di capire quale potrebbe essere un insieme di etica per questo posto. O forse è pazzo. :-)
artlung,

6
@ Shadi, beh, dal lato positivo, la domanda e la risposta sono in StackOverflow e, si spera, aiuteranno altre persone. Vedo che le persone rimangono bloccate su queste cose tutto il tempo, specialmente quando provengono da linguaggi come Java. C'è un motivo per cui le persone lo chiedono più e più volte: è perché PENSANO di sapere come funzionano le espressioni in JavaScript, ma non lo fanno. Fanno ipotesi basate sull'esperienza al di fuori di JS. Ecco perché è così utile provare alcuni semplici test aggiungendo stringhe e numeri e provando più e meno unari.
Nosredna,

Risposte:


120

Vuoi acquisire familiarità con parseInt()e toString().

E utile nel tuo toolkit sarà guardare una variabile per scoprire di che tipo è 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>

Qualche motivo particolare per cui lo metti nei tag di script?
Julix

@ Julix Per i principianti nel 2009, inserendosi in un file html per imparare un concetto di base. Se oggi rispondessi in modo fresco, potrei farlo diversamente, ma forse no.
artlung

53

Passaggio (1) Concatena "1", "2", "3" in "123"

 "1" + "2" + "3"

o

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

Il metodo join concatena gli elementi di un array in una stringa, inserendo il delimitatore specificato tra gli elementi. In questo caso, il "delimitatore" è una stringa vuota ( "").


Passaggio (2) Converti "123" in 123

 parseInt("123")

Prima di ECMAScript 5 , era necessario passare la radice per la base 10:parseInt("123", 10)


Passaggio (3) Aggiungi 123 + 100 = 223

 123 + 100


Passaggio (4) Trasforma 223 in "223"

 (223).toString() 


Metti tutto insieme

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

o

 (parseInt(["1", "2", "3"].join("")) + 100).toString()

4
Bello, chiaro esempio. Inoltre, complimenti per la buona forma: dovresti sempre specificare la radice della parseIntfunzione .
hotshot309

Includere la radice mi ha confuso e sono passato a un'altra risposta in cui era spiegato. Modificato in una rapida spiegazione per essere proprio al punto di confusione.
ArtOfWarfare

@ArtOfWarfare Grazie, buona modifica. Il radix era necessario al momento di questa risposta. In questi giorni, posso fare una discussione per lasciarlo fuori. A partire da ES5, supportato da tutti i browser "moderni" e da Node.js, parseInt (<a stringa con solo 0-9>) utilizza sempre la base 10.
Patrick McElhaney

fatto divertente .. nel JavaScript originale di Netscape (circa 1995) la radice predefinita per parseInt era 8 (a meno che la stringa contenesse e 8 o 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);

Grazie per la stringa veloce -> conversione del numero
mcont

Se controlli che sia un numero o meno, usa parseInt (). Ad esempio, parseInt ("") è NaN, ma + "" è 0!
greene

15

Queste domande sorgono continuamente a causa del sistema di digitazione di JavaScript. Le persone pensano di ottenere un numero quando ricevono la stringa di un numero.

Ecco alcune cose che potresti vedere che traggono vantaggio dal modo in cui JavaScript gestisce stringhe e numeri. Personalmente, vorrei che JavaScript avesse usato un simbolo diverso da + per la concatenazione di stringhe.

Passaggio (1) Concatena "1", "2", "3" in "123"

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

Passaggio (2) Converti "123" in 123

result = +"123";

Passaggio (3) Aggiungi 123 + 100 = 223

result = 123 + 100;

Passaggio (4) Converti 223 in "223"

result = "" + 223;

Se sai PERCHÉ funzionano, è meno probabile che tu abbia problemi con le espressioni JavaScript.


3
In realtà penso che questa sia una pratica estremamente negativa perché è abbastanza opaco su cosa stia succedendo. Sapere che certe operazioni influenzano un cast implicito è un trucco, ed è utile saperlo, ma non è affatto leggibile. La comunicazione è tutto.
annakata

1
Penso che sia importante conoscere queste cose PRECISAMENTE in modo da sapere cosa sta succedendo quando leggi il codice. Molto JavaScript è conciso perché viene trasmesso come sorgente e un codice piccolo può significare una riduzione dei costi del server.
Nosredna,

6
Dovresti raggiungere questo obiettivo attraverso gli strumenti di compressione, in questa forma è l'ottimizzazione a un costo di manutenzione molto reale.
annakata

6
Tuttavia, conoscere queste cose avrebbe aiutato a prevenire la domanda in primo luogo, che era una mancanza di conoscenza su come JavaScript gestisce stringhe e numeri. È una questione di curiosità intellettuale. Cosa succede quando aggiungo un numero a una stringa? Come funziona unary plus? Se non conosci le risposte, non conosci veramente JavaScript e questo tipo di domande sorgeranno.
Nosredna,

11

Puoi farlo in questo modo:

// 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"

16
La migliore pratica sarebbe aggiungere il parametro radix alla funzione parseInt (). quindi, parseInt (uno, 10) assicura che qualunque cosa gli lanci non verrà convertita male.
artlung,

3
Concordato. Altrimenti, i valori che iniziano con 0saranno visti come numeri ottali (base 8) .
hotshot309

1
Ancora più inaspettato, i valori che iniziano con 0e poi contengono 8o 9falliranno, portando a un ritorno di 0. Ad esempio parseInt('034') = 28, e parseInt('09') = 0.
Robert Martin,

9

Per convertire una stringa in un numero, sottrarre 0. Per convertire un numero in una stringa, aggiungere "" (la stringa vuota).

5 + 1 ti darà 6

(5 + "") + 1 ti darà "51"

("5" - 0) + 1 ti darà 6


1
Affidarsi a trucchi basati su stranezze linguistiche come questo può portare a una vera oscurità. es. "5" -0 risulta effettivamente nel numero 5, ma "5" +0 restituisce la stringa "50". (Sì, lo so che sono passati molti anni ed è probabilmente un po 'triste che stessi leggendo questo.)
Nick Rice

6

parseInt è mal funzionante come scanf:

parseInt ("12 scimmie", 10) è un numero con valore "12"
+ "12 scimmie" è un numero con valore "NaN"
Il numero ("12 scimmie") è un numero con valore "NaN"


1

Di seguito è riportato un esempio molto irritante di come JavaScript può metterti nei guai:

Se provi a usare solo parseInt()per convertire in numero e poi aggiungi un altro numero al risultato, concatenerà due stringhe.

Tuttavia, è possibile risolvere il problema inserendo l'espressione di somma tra parentesi come mostrato nell'esempio seguente.

Risultato: la somma della loro età è: 98; La loro somma di età NON è: 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>


0

Il più semplice è quando vuoi rendere un numero intero una stringa

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

Ora, dalla variabile b che è di tipo stringa possiamo ottenere l'intero

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

Se vuoi controllare sopra c'è un numero. Se non sei sicuro che b contenga un numero intero, puoi usare

if(isNaN(c*1)) {
  //NOt a number
}
else //number

0

Possiamo farlo usando l' operatore più unario per convertirli prima in numeri e aggiungerli semplicemente. vedi sotto:-

var a = "4";
var b = "7";
var sum = +a + +b; 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.