簡體   English   中英

在JavaScript中將整個String轉換為Integer

[英]Convert an entire String into an Integer in JavaScript

我最近遇到了一段非常像這樣的代碼:

var nHours = parseInt(txtHours);
if( isNaN(nHours))  // Do something
else // Do something else with the value

編寫此代碼的開發人員認為nHours可能是與txtHoursNaN完全匹配的整數。 這個假設有幾個問題。

首先,開發人員左邊的radix參數意味着輸入"09"將導致值為0而不是9 這個問題可以通過添加基數來解決:

var nHours = parseInt(txtHours,10);
if( isNaN(nHours))  // Do something
else // Do something else with the value

接下來,輸入"1.5"將導致值1而不是NaN ,這不是開發人員預期的,因為1.5不是整數。 同樣,值"1a"將導致值1而不是NaN

所有這些問題都是可以理解的,因為這是如何將字符串轉換為整數的最常見示例之一,並且大多數地方不討論這些情況。

無論如何,它讓我覺得我不知道有任何內置的方法來獲得這樣的整數。 Number(txtHours) (或+txtHours )更接近但接受非整數數字,並將null""視為0而不是NaN

為了幫助開發人員,我提供了以下功能:

function ConvertToInteger(text)
{
    var number = Math.floor(+text);
    return text && number == text ? number : NaN;
}

這似乎涵蓋了上述所有問題。 有沒有人知道這種技術有什么問題,或者更簡單的方法來獲得相同的結果?

在這里,這就是我想出的:

function integer(x) {
    if (typeof x !== "number" && typeof x !== "string" || x === "") {
        return NaN;
    } else {
        x = Number(x);
        return x === Math.floor(x) ? x : NaN;
    }
}

(注意:我更新了此功能以防范白色空間字符串。請參閱下文。)

我們的想法是只接受類型為Number或String(但不是空字符串值)的參數。 然后轉換為Number(如果它是一個字符串),最后將其值與floor()值進行比較,以確定該數字是否為整數。

integer(); // NaN
integer(""); // NaN
integer(null); // NaN
integer(true); // NaN
integer(false); // NaN
integer("1a"); // NaN
integer("1.3"); // NaN
integer(1.3); // NaN    
integer(7); // 7

但是,這里的NaN值是“誤用”,因為表示浮點數的浮點數和字符串會導致NaN,這在技術上並不正確。

另請注意,由於字符串轉換為數字的方式,字符串參數可能具有尾隨或前導空格或前導零:

integer("   3   "); // 3    
integer("0003"); // 3

另一種方法......

如果輸入值是字符串,則可以使用正則表達式。 這個正則表達式: /^\\s*(\\+|-)?\\d+\\s*$/將匹配表示整數的字符串。

更新的功能!

function integer(x) {
    if ( typeof x === "string" && /^\s*(\+|-)?\d+\s*$/.test(x) ) {
        x = Number(x);
    }
    if ( typeof x === "number" ) {
        return x === Math.floor(x) ? x : NaN;
    }
    return NaN;
}

這個版本的integer()更嚴格,因為它只允許遵循某種模式的字符串(使用正則表達式進行測試)。 它產生與其他integer()函數相同的結果,除了它另外忽略所有空格字符串(如@CMS所指出的)。

再次更新!

我注意到了@Zecc的答案並簡化了代碼......我想這也有效:

function integer(x) {
    if( /^\s*(\+|-)?\d+\s*$/.test(String(x)) ){
        return parseInt(x, 10);
    }
    return Number.NaN;
}  

它可能不是最快的解決方案(在性能方面),但我喜歡它的簡單:)

這是我的嘗試:

function integer(x) {
    var n = parseFloat(x); // No need to check typeof x; parseFloat does it for us
    if(!isNaN(n) && /^\s*(\+|-)?\d+\s*$/.test(String(x))){
        return n;
    }
    return Number.NaN;
}

我必須將ŠimeVidas歸功於正則表達式,盡管我會親自到達那里。

編輯 :我不知道有一個NaN全球。 我一直使用Number.NaN
活到老,學到老。

我的解決方案涉及一些廉價技巧 它基於以下事實:Javascript中的位運算符將其操作數轉換為整數。

我不太確定代表整數的字符串是否應該起作用,所以這里有兩種不同的解決方案。

function integer (number) { 
  return ~~number == number ? ~~number : NaN; 
}

function integer (number) {
  return ~~number === number ? ~~number : NaN;
}

第一個將使用整數作為字符串,第二個不會。 按位非(〜)運算符將其操作數轉換為整數。 對於整數較大的整數,此方​​法失敗,無法用32位寬的整數表示(-2147483647 ... 2147483647)表示。

您可以先將String轉換為Integer,然后再轉換回String。 然后檢查第一個和第二個字符串是否匹配

編輯 :我的意思的一個例子:

function cs (stringInt) {
    var trimmed = stringInt.trim();     // trim original string
    var num = parseInt(trimmed, 10);    // convert string to integer
    newString = num + "";               // convert newly created integer back to string
    console.log(newString);             // (works in at least Firefox and Chrome) check what's new string like
    return (newString == trimmed);      // if they are identical, you can be sure that original string is an integer
}

如果您輸入的字符串實際上是整數,則此函數將返回true。 如果您不想修剪,可以修改它。 使用前導零將失敗,但是,如果您願意,可以再次在此函數中刪除它們。 這樣,您不需要使用NaN或正則表達式,您可以輕松檢查字符串整數的有效性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM