drs*_*222 7 javascript string integer
我最近遇到了一段非常像这样的代码:
var nHours = parseInt(txtHours);
if( isNaN(nHours)) // Do something
else // Do something else with the value
Run Code Online (Sandbox Code Playgroud)
谁写了这个代码的开发人员的印象是,在nHours要么是完全匹配的整数txtHours或NaN.这个假设有几个问题.
首先,开发人员留下的radix参数意味着输入"09"将导致值0而不是9.这个问题可以通过添加基数来解决:
var nHours = parseInt(txtHours,10);
if( isNaN(nHours)) // Do something
else // Do something else with the value
Run Code Online (Sandbox Code Playgroud)
接下来,输入"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;
}
Run Code Online (Sandbox Code Playgroud)
这似乎涵盖了上述所有问题.有没有人知道这种技术有什么问题,或者更简单的方法来获得相同的结果?
在这里,这就是我想出的:
function integer(x) {
if (typeof x !== "number" && typeof x !== "string" || x === "") {
return NaN;
} else {
x = Number(x);
return x === Math.floor(x) ? x : NaN;
}
}
Run Code Online (Sandbox Code Playgroud)
(注意:我更新了此函数以防止出现空格字符串。请参见下文。)
这个想法是只接受类型为 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
Run Code Online (Sandbox Code Playgroud)
然而,NaN 值在这里被“误用”,因为浮点数和表示浮点数的字符串会导致 NaN,而这在技术上是不正确的。
另请注意,由于字符串转换为数字的方式,字符串参数可能有尾随或前导空格,或前导零:
integer(" 3 "); // 3
integer("0003"); // 3
Run Code Online (Sandbox Code Playgroud)
另一种方法...
如果输入值是字符串,则可以使用正则表达式。此正则表达式:/^\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;
}
Run Code Online (Sandbox Code Playgroud)
这个版本的integer() 更加严格,因为它只允许遵循特定模式的字符串(使用正则表达式进行测试)。它产生与其他integer()函数相同的结果,除了它另外忽略所有空白字符串(正如@CMS所指出的)。
又更新了!
我注意到@Zecc的答案并稍微简化了代码......我想这也有效:
function integer(x) {
if( /^\s*(\+|-)?\d+\s*$/.test(String(x)) ){
return parseInt(x, 10);
}
return Number.NaN;
}
Run Code Online (Sandbox Code Playgroud)
它可能不是最快的解决方案(就性能而言),但我喜欢它的简单性:)