繁体   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