2012-02-23 16 views
6

Sto cercando di capire i calcoli ottali e esadecimali javascript. So che posso usare parseInt(string, radix) per ottenere il valore Integer.Conversione di numeri ottali ed esadecimali sulla base 10

Ad esempio, quando provo questo perché i valori sono diversi?

var octal = parseInt('026', 8); 
var octal1 = parseInt('030', 8); 
alert(octal); //22 
alert(octal1); //24  

var hex = parseInt('0xf5', 16); 
var hex1 = parseInt('0xf8', 16); 
alert(hex); //245 
alert(hex1); //248 

Ma se provo a salvarla in un array perché sono le risposte differenti e non è corretto?

var x = new Array(026, 5, 0xf5, "abc"); 
var y = new Array(030, 3, 0xf8, "def"); 

alert('026 is ' + parseInt(x[0],8)); //18 
alert('0xf5 is ' + parseInt(x[2],16)); //581 
alert('030 is ' + parseInt(y[0],8)); //20 
alert('0xf8 is ' + parseInt(y[2],16)); //584 
+0

hai ragione. La prima parte non è necessaria. 'alert (026)' darà '22'. E gli array? – theking963

+1

Si noti che 'var foo = new Array (...);' non è quasi mai preferibile a 'var foo = [...];' come il primo è più byte, più lento e funzionalmente equivalente. – Phrogz

risposta

6

parseInt converte l'argomento stringa prima di analizzarlo:

  1. Let InputString essere ToString (stringa)

Quindi:

0x35.toString() // "53" 
parseInt("53", 16); //83 
parseInt(0x35, 16); //83 

Quello che hai nei tuoi array sono in gran parte già numeri quindi non c'è bisogno di analizzarli. Otterrete i risultati attesi se li si cambia a stringhe:

var x = new Array("026", "5", "0xf5", "abc"); 
var y = new Array("030", "3", "0xf8", "def"); 
0

0xf5 visto al di fuori di una stringa è l'intero 245; non è una stringa che deve essere analizzato:

console.log("0xf5");    //-> 0xf5 
console.log(parseInt("0xf5",16)); //-> 245 
console.log(0xf5);    //-> 245 
console.log(parseInt(0xf5,16) ); //-> 581 
console.log(parseInt("245",16));  //-> 581 
console.log(parseInt(245,16) );  //-> 581 

Allo stesso modo, 026 fuori una stringa è il numero intero 22:

console.log(026);     //-> 22 

Quello che stai facendo è passando già convertito-to-Base10 numeri interi a parseInt(), che poi li converte in stringhe e interpreta base10 come base16, eseguendo la conversione di base una seconda volta.

+0

'026 === 22' non è necessariamente un'espressione valida in EcmaScript 5 perché i valori letterali ottali non sono standard. Vedi la [specifica] (http://es5.github.com/#B.1.1) per i dettagli. –

1

Ho scritto una funzione in grado di convertire un numero da una base a un'altra, in cui la base iniziale e la nuova base sono specificate come parametri.

function convertFromBaseToBase(str, fromBase, toBase){ 
    var num = parseInt(str, fromBase); 
    return num.toString(toBase); 
} 

alert(convertFromBaseToBase(10, 2, 10)); 

http://jsfiddle.net/jarble/p9ZLa/