在Javascript中检查变量是否包含数值?
在PHP中,这非常简单:在Javascript中检查变量是否包含数值?,javascript,Javascript,在PHP中,这非常简单: is_numeric(23);//true is_numeric("23");//true is_numeric(23.5);//true is_numeric(true);//false 但是如何在Javascript中实现这一点? 我可以使用正则表达式,但有没有函数 function is_numeric(val) { return ((+val) == val); } 这样就可以了。这会检查数值,包括负数和浮点数 function is_numeric(v
is_numeric(23);//true
is_numeric("23");//true
is_numeric(23.5);//true
is_numeric(true);//false
但是如何在Javascript中实现这一点?
我可以使用正则表达式,但有没有函数
function is_numeric(val) {
return ((+val) == val);
}
这样就可以了。这会检查数值,包括负数和浮点数
function is_numeric(val){
return val && /^-?\d+(\.\d+)?$/.test(val + '');
}
@沃德勒:我修正了正则表达式。它现在应该可以正常工作了。那么:
function isNumber(n){
return typeof(n) != "boolean" && !isNaN(n);
}
内置函数用于检查值是否为而不是数字
更新:Christoph是正确的,在JavaScript中,布尔类型可转换为数字,返回1表示真,返回0表示假,因此如果计算1+true
,结果将为2
考虑到这种行为,我已经更新了函数,以防止将布尔值转换为其数值表示形式。要检查javascript中的类型,可以使用
typeof
操作符:
js> var x = 1;
js> typeof(x);
number
因此:
如果要将变量的值强制为整数,可以使用parseInt(x,10)
将值解析为以10为基数的整数。类似地,如果需要浮点值,可以使用parseFloat
。但是,无论类型如何,这些都将始终强制,因此传递null
,true
等将始终返回一个数字。但是,您可以通过调用isNaN
来检查该号码是否有效
因此,把所有这些放在一起:
!isNaN(parseFloat(23)) // true
!isNaN(parseFloat('23')) // true
!isNaN(parseFloat(23.5)) // true
!isNaN(parseFloat(true)) // false
或
我认为到目前为止,这些建议都不起作用。乙二醇
!isNaN(parseFloat(foo))
不会,因为parseFloat()
忽略尾随的非数字字符
为了解决这个问题,您可以通过Number()
将返回值与转换返回的值进行比较(或者使用一元+
进行等效比较,但我更喜欢显式转换):
如果两个函数都返回NaN
,这仍然有效,因为NaN!==NaN
为真
另一种可能是先转换为字符串,然后转换为数字,然后检查NaN
,即
!isNaN(Number(String(foo)))
isFinite(Number(String(foo)))
或等效,但可读性较差(但很可能更快)
如果要排除无穷大值,请使用isFinite()
而不是!isNaN()
,即
!isNaN(Number(String(foo)))
isFinite(Number(String(foo)))
通过Number()
显式转换实际上是不必要的,因为isNan()
和isFinite()
隐式转换为Number-这就是的原因!isNaN()
不起作用
因此,我认为最合适的解决办法是
isFinite(String(foo))
正如Matthew指出的,第二种方法不能正确处理只包含空格的字符串 这不难修复-使用Matthew评论中的代码或
isFinite(String(foo).trim() || NaN)
您必须决定这是否比比较
parseFloat()
和Number()
的结果更好。下面是我的想法:
value = "2.34";
if (parseFloat(value).toString() === value) {
alert("number");
}
这应该适用于浮点和整数,正数和负数。我不知道无穷大,正如上面的一些答案所讨论的那样
如果您的值实际上可能是一个数字,而不总是一个字符串,那么您可以将===更改为a==并同时处理这两个值。以下是isNaN与isFinite和typeof==“数字”的一些基准测试
显然,typeof==“number”的速度大约快5倍运行代码片段,查看关于此主题的顶级答案的比较 有些测试用例没有突出显示(并且没有对摘要做出贡献)。这些情况被标记为不明确,因为不清楚给定值是否应被视为数字
//如果输入为
//数
常数解决方案测试=[
v=>parseFloat(v),
v=>数字(v),
v=>!伊斯南(v),
v=>typeof v!=“boolean”&&&!isNaN(v),
v=>isFinite(字符串(v)),
v=>!isNaN(parseFloat(v))和&isFinite(v)
];
常量测试用例=[
//[测试名称、测试值、预期输出不明确]
//空白
[“,”,假,假],
[“\\t”、“\t”、假、假],
[“,”,假,假],
//无穷大
['无限','无限',假,真],
[“+Infinity”,“Infinity”,假,真],
[“-无限”,-无限,假,真],
[“无限”,无限,假,真],
//混有符号的数字
[‘123abc’、‘123abc’、假、真],
['“abc123”,“abc123”,假,假],
[“.0.”、“.0.”、假、假],
['“1.”,“1.”,真的,真的],
[“,”,假,真],
[‘01’,‘01’,对,对],
[“-0”、“-0”、真、真],
[“+1”,“+1,对,对],
[“-1”,-1,对,对],
//其他js类型
[“'null'”,“null”,false,false],
[“真”,“真”,假,假],
[“假”,“假”,假,假],
[“空”,空,假,假],
[“真”,真,假,假],
[“假”,假,假,假],
[“南”,南,假,假],
[“[”,[],假,假],
[“{},{},假,假],
[“/。/”,/。/,假,假],
[“()=>{}”,()=>{},假,假]
];
常量样式={
代码:{
fontFamily:“单空间”,
字体大小:16
},
成功:{
背景颜色:“00ff5478”
},
失败:{
背景颜色:“ff00008c”
}
};
类TestCaseTable扩展了React.Component{
静态renderTableHeader(solutionsToTest){
返回(
测试用例
{solutionsToTest.map(f=>(
{f.toString()}
))}
);
}
静态renderTableRow(testCase、solutionsToTest){
const[testName,input,expectedOutput,isAmbiguous]=testCase;
返回(
{testName}
{solutionsToTest.map(f=>{
常量输出=布尔值(f(输入));
const style=isAmbiguous
? {}
:output==expectedOutput?styles.success:styles.failure;
返回(
{output+“”}
);
})}
);
}
render(){
//对测试用例进行排序,将不明确的放在后面
isFinite(String(foo).trim() || NaN)
value = "2.34";
if (parseFloat(value).toString() === value) {
alert("number");
}
function isValidNumber(value) {
return typeof value === 'number' && Number.isNaN(value) === false;
}
isValidNumber(10) // true
isValidNumber(10.34) // true
isValidNumber('geo10') // false
isValidNumber('10geo') // false
isValidNumber('') // false
isValidNumber(NaN) // false
isValidNumber(true) // false
isValidNumber(false) // false