在JavaScript中将整个字符串转换为整数
我最近碰到了一段非常类似于这样的代码:
var nHours = parseInt(txtHours);
if( isNaN(nHours)) // Do something
else // Do something else with the value
编写此代码的开发人员的印象是, nHours
可能是完全匹配txtHours
或NaN
的整数。 这个假设有几个错误。
首先,开发者离开了基数参数,这意味着输入"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(如果它是一个字符串),最后将其值与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;
}
它probaly不是最快的解决方案(在性能方面),但我喜欢它的简单:)
这是我的尝试:
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)表示的较大的整数失败。
链接地址: http://www.djcxy.com/p/48861.html上一篇: Convert an entire String into an Integer in JavaScript
下一篇: Can GLSL output to two/multiple textures at the same time?