首頁  >  文章  >  web前端  >  Number()、parseInt()和parseFloat()數值轉換

Number()、parseInt()和parseFloat()數值轉換

PHP中文网
PHP中文网原創
2017-06-22 14:08:223779瀏覽

有3個函數可以把非數值轉換成數值:Number()、parseInt()和parseFloat()。第一個函數,即轉型函數Number()可以用於任何資料類型,而另兩個函數則專門用於把字串轉換成數值。這個3個函數對於同樣的輸入會有不同的結果。

  Number()函數的轉換規則如下:

如果是Boolean值,true和false將分別被轉換為1和0
如果是是數字值,只是簡單的傳入和回傳
如果是null值,傳回0
如果是undefined,則傳回NaN
如果是字串,遵循下列規則:
如果字串中只包含數字,則將其轉換為十進制數值,級“1”會變成1,“123”會變成123,而“011”會變成11(前面的0被忽略了)
如果字串中只包含有效的浮點格式,如“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

  首先,字串「Hello world!」會轉換為NaN,因為其中不包含任何有意義的數字值。空字串會被轉換為0。字串“000011”會被轉換為11,因為忽略了前導零。最後,true值被轉換為1。

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

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

  為了更好地理解parseInt()函數的轉換規則,下面給出了一些例子:

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()解析“070”和“70”的不同方式。此時「070」中的前導零表示這是一個八進位(而非 十進位)格式的字串,因此結果是56(注意這個結果與呼叫Number()函數不同)。而“70”,由於沒有前導零,因此就被轉換成了70。為了消除 使用parseInt()函數時可能導致的上述困惑,ECMAScript也為這個函數提供了第二個參數:轉換時所使用的基數(即多少進位)。

  如果要知道要解析的值是十六進位格式的字串,那麼指定基數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()決定如何解析輸入的字串,因此為了避免錯誤的解析,我們建議無論在什麼情況下都明確指定基數——特別是在像下面這樣處理八進制的情況下:

var num1 = parseInt("010"); //8
var num2 = parseInt("010", 8); //8
var num2 = parseInt("010", 10); //10

  在这个例子中,“010”会因为第二个参数不同而被转换成不同的值。第一行的转换很直观,即让parseInt()决定如何转换。由于第一个字符是 “0”而后面也是数字字符,因而parseInt()假设它是一个八进制数。实际上,parseInt()的这个默认行为域第二行转换中明确了基数行为是 一致的。第三行传入基数10,因此parseInt()就会忽略字符串中的前导零,而只解析其余的数字符。

  多数情况下,我们要解析的都是十进制数值,因此始终将10作为第二个参数是非常必要的。

  与parseInt()函数类似,parseFloat()也是从第一个字符(位置0)开始解析每个字符。而且也是一直解析到字符串末尾,或者解析 到遇见一个无效的浮点数字字符为止。也就是说,字符串中的第一个小数点是有效的,而第二个小数点是无效的,因此它后面的字符串将被忽略。举例来 说,“22.34.5”将会被转换为22.34。

  除了第一个小数点有效之外,parseFloat()与parseInt()的第二个区别在于它始终都会忽略前导零。parseFloat()可以 识别前面讨论过的所有浮点数值格式,也包括十进制整数格式。但十六进制格式的字符串始终会被转换为0。由于parseFloat()只解析十进制值,因此 它没有用第二个参数指定基数的用法。最后还要注意一点:如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后面都是 零),parseFloat()会返回整数。以下是使用parseFloat()转换数值的几个典型示例:

var num1 = parseFloat("1234blue"); //1234
var num1 = parseFloat("0xA"); //0
var num1 = parseFloat("22.5"); //22.5
var num1 = parseFloat("22.34.5"); //22.34
var num1 = parseFloat("0908.5"); //908.5
var num1 = parseFloat("3.125e7"); //31250000

以上是Number()、parseInt()和parseFloat()數值轉換的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn