JS轉換爲數字的方法Number()、parseInt()和 parseFloat()

Number()、parseInt()和 parseFloat()

 

第一個函數, 即轉型函數 Number()可以用於任何數據類型,而另兩個函數則專門用於把字符串轉換成數值。這 3 個 函數對於同樣的輸入會有返回不同的結果

Number()函數的轉換規則如下。
 如果是 Boolean 值,true 和 false 將分別被轉換爲 1 和 0。  如果是數字值,只是簡單的傳入和返回。
 如果是 null 值,返回 0。
 如果是 undefined,返回 NaN。
 如果是字符串,遵循下列規則:

  •   如果字符串中只包含數字(包括前面帶正號或負號的情況),則將其轉換爲十進制數值,即"1" 會變成 1,"123"會變成 123,而"011"會變成 11(注意:前導的零被忽略了);

  •   如果字符串中包含有效的浮點格式,如"1.1",則將其轉換爲對應的浮點數值(同樣,也會忽 略前導零);

  •   如果字符串中包含有效的十六進制格式,例如"0xf",則將其轉換爲相同大小的十進制整 數值;

  •   如果字符串是空的(不包含任何字符),則將其轉換爲 0;

  •   如果字符串中包含除上述格式之外的字符,則將其轉換爲 NaN。
      如果是對象,則調用對象的 valueOf()方法,然後依照前面的規則轉換返回的值。如果轉換

    的結果是 NaN,則調用對象的 toString()方法,然後再次依照前面的規則轉換返回的字符

    串值。

舉個例子

    var num1== Number("Hello world!")   ; //NaN
    var num2 = Number(""); //0
    var num3= Number("000011"); //11
    var num4 = Number(true); //1

由於 Number()函數在轉換字符串時比較複雜而且不夠合理,因此在處理整數的時候更常用的是 parseInt()函數。parseInt()函數在轉換字符串時,更多的是看其是否符合數值模式。它會忽略字 符串前面的空格,直至找到第一個非空格字符。如果第一個字符不是數字字符或者負號,parseInt() 就會返回 NaN;也就是說,用 parseInt()轉換空字符串會返回 NaN(Number()對空字符返回 0)。如 果第一個字符是數字字符,parseInt()會繼續解析第二個字符,直到解析完所有後續字符或者遇到了 一個非數字字符。例如,"1234blue"會被轉換爲 1234,因爲"blue"會被完全忽略。類似地,"22.5" 4 會被轉換爲 22,因爲小數點並不是有效的數字字符。

如果字符串中的第一個字符是數字字符,parseInt()也能夠識別出各種整數格式(即前面討論的 十進制、八進制和十六進制數)。也就是說,如果字符串以"0x"開頭且後跟數字字符,就會將其當作一 5 個十六進制整數;如果字符串以"0"開頭且後跟數字字符,則會將其當作一個八進制數來解析。

 

 

var num1 = parseInt("1234blue");// 1234
var num2 = parseInt("");// NaN
var num3 = parseInt("0xA");// 10(十六進制數)
var num4 = parseInt(22.5); // 22
var num5 = parseInt("070");// 56(八進制數)
var num6 = parseInt("70"); // 70(十進制數) 
var num7 = parseInt("0xf");// 15(十六進制數)

在使用 parseInt()解析像八進制字面量的字符串時,ECMAScript 3 和 5 存在分歧。例如: //ECMAScript 3 認爲是 56(八進制),ECMAScript 5 認爲是 70(十進制)

var num = parseInt("070");

在 ECMAScript 3 JavaScript 引擎中,"070"被當成八進制字面量,因此轉換後的值是十進制的 56。 而在 ECMAScript 5 JavaScript 引擎中,parseInt()已經不具有解析八進制值的能力,因此前導的零會 被認爲無效,從而將這個值當成"70",結果就得到十進制的 70。在 ECMAScript 5 中,即使是在非嚴格 模式下也會如此。

爲了消除在使用 parseInt()函數時可能導致的上述困惑,可以爲這個函數提供第二個參數:轉換 時使用的基數(即多少進制)。如果知道要解析的值是十六進制格式的字符串,那麼指定基數 16 作爲第 二個參數,可以保證得到正確的結果,例如:

var num = parseInt("0xAF", 16); //175

實際上,如果指定了 16 作爲第二個參數,字符串可以不帶前面的"0x"var num1 = parseInt("AF", 16); //175 var num2 = parseInt("AF"); //NaN

這個例子中的第一個轉換成功了,而第二個則失敗了。差別在於第一個轉換傳入了基數,明確告訴 parseInt()要解析一個十六進制格式的字符串;而第二個轉換髮現第一個字符不是數字字符,因此就 自動終止了。

指定基數會影響到轉換的輸出結果。例如:
var num1 = parseInt("10", 2);//2 (按二進制解析)
var num2 = parseInt("10", 8); //8 (按八進制解析)
var num3 = parseInt("10", 10); //10(按十進制解析)
var num4 = parseInt("10", 16); //16(按十六進制解析)

與 parseInt()函數類似,parseFloat()也是從第一個字符(位置 0)開始解析每個字符。而且 也是一直解析到字符串末尾,或者解析到遇見一個無效的浮點數字字符爲止。也就是說,字符串中的第 一個小數點是有效的,而第二個小數點就是無效的了,因此它後面的字符串將被忽略。舉例來說, "22.34.5"將會被轉換爲 22.34。

除了第一個小數點有效之外,parseFloat()與 parseInt()的第二個區別在於它始終都會忽略前導 的零。parseFloat()可以識別前面討論過的所有浮點數值格式,也包括十進制整數格式。但十六進制格 式的字符串則始終會被轉換成 0。由於 parseFloat()只解析十進制值,因此它沒有用第二個參數指定基 數的用法。最後還要注意一點:如果字符串包含的是一個可解析爲整數的數(沒有小數點,或者小數點後 都是零),parseFloat()會返回整數。以下是使用 parseFloat()轉換數值的幾個典型示例。

NumberExample07.htm

var num1 = parseFloat("1234blue");//1234 (整數)
var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.5");//22.5
var num4 = parseFloat("22.34.5"); //22.34 
var num5 = parseFloat("0908.5");//908.5 
var num6 = parseFloat("3.125e7");//31250000
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章