4 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊
在javascript中將字符串轉(zhuǎn)換為數(shù)字有兩種主要方法。一種方法是解析它,另一種方法是將其類型更改為數(shù)字。其他答案中的所有技巧(例如一元加)都涉及隱含地將字符串的類型強(qiáng)制轉(zhuǎn)換為數(shù)字。您也可以使用Number函數(shù)顯式執(zhí)行相同的操作。
解析
var parsed = parseInt("97", 10);
parseInt和parseFloat是用于將字符串解析為數(shù)字的兩個(gè)函數(shù)。解析會(huì)在遇到無法識別的字符時(shí)靜默停止,這對于解析像“92px”這樣的字符串很有用,但它也有點(diǎn)危險(xiǎn),因?yàn)樗粫?huì)在輸入錯(cuò)誤時(shí)給你任何錯(cuò)誤,而是你除非字符串以數(shù)字開頭,否則將返回NaN。字符串開頭的空格將被忽略。這是一個(gè)例子,它做了一些不同于你想要的東西,并沒有表明出現(xiàn)任何問題:
var widgetsSold = parseInt("97,800", 10); // widgetsSold is now 97
總是將基數(shù)指定為第二個(gè)參數(shù)是一種好習(xí)慣。在較舊的瀏覽器中,如果字符串以0開頭,如果未指定基數(shù),則會(huì)將其解釋為八進(jìn)制,這會(huì)讓很多人感到意外。如果沒有指定基數(shù),則通過使字符串以0x開頭來觸發(fā)十六進(jìn)制的行為,例如0xff
。標(biāo)準(zhǔn)實(shí)際上使用ecmascript 5進(jìn)行了更改,因此如果沒有指定基數(shù),則當(dāng)前導(dǎo)0時(shí),現(xiàn)代瀏覽器不再觸發(fā)八進(jìn)制。parseInt將基數(shù)理解為基數(shù)36,在這種情況下,大寫和小寫字母都被視為等價(jià)。
將字符串的類型更改為數(shù)字
上面提到的所有其他不使用parseInt的技巧都涉及隱式地將字符串強(qiáng)制轉(zhuǎn)換為數(shù)字。我更愿意明確地這樣做,
var cast = Number("97");
這與解析方法有不同的行為(盡管它仍然忽略空格)。它更嚴(yán)格:如果它不理解整個(gè)字符串而不是它返回NaN
,那么你不能將它用于像字符串這樣的字符串97px
。由于您需要原始數(shù)字而不是數(shù)字包裝器對象,因此請確保不要放在new
數(shù)字函數(shù)前面。
顯然,轉(zhuǎn)換為Number會(huì)給出一個(gè)可能是float而不是整數(shù)的值,所以如果你想要一個(gè)整數(shù),你需要修改它。有幾種方法可以做到這一點(diǎn):
var rounded = Math.floor(Number("97.654")); // other options are Math.ceil, Math.roundvar fixed = Number("97.654").toFixed(0); // rounded rather than truncatedvar bitwised = Number("97.654")|0; // do not use for large numbers
任何按位運(yùn)算符(這里我做了一個(gè)按位或,但你也可以做一個(gè)雙重否定,如在前面的回答或一個(gè)位移)將把值轉(zhuǎn)換為32位整數(shù),其中大多數(shù)將轉(zhuǎn)換為有符號整數(shù)。請注意,這不希望您想要大整數(shù)。如果整數(shù)不能用32位表示,它將換行。
~~"3000000000.654" === -1294967296// This is the same asNumber("3000000000.654")|0"3000000000.654" >>> 0 === 3000000000 // unsigned right shift gives you an extra bit"300000000000.654" >>> 0 === 3647256576 // but still fails with larger numbers
要使用更大的數(shù)字,您應(yīng)該使用舍入方法
Math.floor("3000000000.654") === 3000000000// This is the same asMath.floor(Number("3000000000.654"))
請記住,所有的這些方法的理解指數(shù)形式,所以2e2
是200
不是NaN的。此外,Number理解“Infinity”,而解析方法則不理解。
習(xí)慣
這些方法中的任何一種都不可能完全符合您的要求。例如,通常我希望在解析失敗時(shí)拋出錯(cuò)誤,并且我不需要支持Infinity,指數(shù)或前導(dǎo)空格。根據(jù)您的用例,有時(shí)編寫自定義轉(zhuǎn)換函數(shù)是有意義的。
始終檢查Number或其中一個(gè)解析方法的輸出是否是您期望的數(shù)字。您幾乎肯定會(huì)想要isNaN
確保該數(shù)字不是NaN(通常是您發(fā)現(xiàn)解析失敗的唯一方法)。
添加回答
舉報(bào)