How do I check that a number is float or integer?
如何找到一个数字是
1 2 3 4 | 1.25 --> float 1 --> integer 0 --> integer 0.25 --> float |
除以1时检查余数:
1 2 3 | function isInt(n) { return n % 1 === 0; } |
如果您不知道参数是数字,则需要进行两次测试:
1 2 3 4 5 6 7 | function isInt(n){ return Number(n) === n && n % 1 === 0; } function isFloat(n){ return Number(n) === n && n % 1 !== 0; } |
尝试使用这些函数来测试一个值是否是一个没有小数部分并且在可以表示为精确整数的大小限制内的数字基元值。
1 2 3 4 5 6 7 | function isFloat(n) { return n === +n && n !== (n|0); } function isInteger(n) { return n === +n && n === (n|0); } |
为什么不这样:
1 | var isInt = function(n) { return parseInt(n) === n }; |
有一个名为
1 2 3 4 5 | if (!Number.isInteger) { Number.isInteger = function isInteger (nVal) { return typeof nVal ==="number" && isFinite(nVal) && nVal > -9007199254740992 && nVal < 9007199254740992 && Math.floor(nVal) === nVal; }; } |
可以使用简单的正则表达式:
1 2 3 4 5 6 | function isInt(value) { var er = /^-?[0-9]+$/; return er.test(value); } |
或者您也可以根据需要使用以下功能。它们由PHPJS项目开发。
更新1
现在它也检查负数,谢谢@chrisbartley评论!
以下是有效的函数,用于检查值是数字还是可以安全地转换为数字:
1 2 3 4 5 6 7 8 9 | function isNumber(value) { if ((undefined === value) || (null === value)) { return false; } if (typeof value == 'number') { return true; } return !isNaN(value - 0); } |
对于整数(如果值是浮点值,则返回false):
1 2 3 4 5 6 | function isInteger(value) { if ((undefined === value) || (null === value)) { return false; } return value % 1 == 0; } |
这里的效率是,当值已经是数字时,避免使用parseInt(或parseNumber)。两个解析函数总是先转换为字符串,然后尝试解析该字符串,如果该值已经是数字,这将是浪费。
感谢您在这里的其他帖子为优化提供进一步的想法!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | function isInteger(x) { return typeof x ==="number" && isFinite(x) && Math.floor(x) === x; } function isFloat(x) { return !!(x % 1); } // give it a spin isInteger(1.0); // true isFloat(1.0); // false isFloat(1.2); // true isInteger(1.2); // false isFloat(1); // false isInteger(1); // true isFloat(2e+2); // false isInteger(2e+2); // true isFloat('1'); // false isInteger('1'); // false isFloat(NaN); // false isInteger(NaN); // false isFloat(null); // false isInteger(null); // false isFloat(undefined); // false isInteger(undefined); // false |
1 2 3 4 5 6 7 | function isInt(n) { return n !="" && !isNaN(n) && Math.round(n) == n; } function isFloat(n){ return n !="" && !isNaN(n) && Math.round(n) != n; } |
适用于所有情况。
下面是整数的用法:
1 | Math.ceil(parseFloat(val)) === val |
很短,很好:)一直有效。如果我没弄错的话,这就是大卫·弗拉纳根的建议。
正如其他人提到的,JS中只有双精度。那么,如何定义一个整数?只需检查整数是否等于自身:
1 2 3 4 | function isInteger(f) { return typeof(f)==="number" && Math.round(f) == f; } function isFloat(f) { return typeof(f)==="number" && !isInteger(f); } |
带有零小数部分(例如1.0、12.00、0.0)的任何浮点数都隐式转换为整数,因此无法检查它们是否为浮点数。
1 2 | !!(24%1) // false !!(24.2%1) // true |
1 | var isInt = function (n) { return n === (n | 0); }; |
还没有这样做的案例。
很简单:
1 | if( n === parseInt(n) ) ... |
在控制台中尝试此操作:
1 2 3 4 5 6 7 8 9 10 11 | x=1; x===parseInt(x); // true x="1"; x===parseInt(x); // false x=1.1; x===parseInt(x); // false, obviously // BUT! x=1.0; x===parseInt(x); // true, because 1.0 is NOT a float! |
这让很多人困惑。每当某个值为.0时,它就不再是浮点数了。它是一个整数。或者你可以把它叫做"数字的东西",因为它没有严格的区别,就像以前的c。好的旧时代。
所以基本上,你所能做的就是检查整数,接受1.000是一个整数的事实。
有趣的旁注
有人对巨额数字发表了评论。对于这种方法来说,巨大的数字意味着没有问题;每当parseint无法处理数字(因为它太大)时,它将返回实际值以外的值,因此测试将返回false。这是一件好事,因为如果你把某个东西看作一个"数字",你通常期望JS能够用它来计算——所以是的,数字是有限的,ParseInt会考虑到这一点,用这种方式来表达。
试试这个:
1 2 3 4 5 | var a = 99999999999999999999; var b = 999999999999999999999; // just one more 9 will kill the show! var aIsInteger = (a===parseInt(a))?"a is ok":"a fails"; var bIsInteger = (b===parseInt(b))?"b is ok":"b fails"; alert(aIsInteger+";"+bIsInteger); |
在我的浏览器(ie8)中,这会返回"A是正常的;B是失败的",这完全是因为B中的大量数字。限制可能会有所不同,但我猜20位数字"应该足够任何人使用",引用一个经典的:)
这真的取决于你想要实现什么。如果你想"模仿"强类型语言,那么我建议你不要尝试。正如其他人提到的,所有数字都具有相同的表示形式(相同的类型)。
使用克劳迪乌提供的东西:
从常识上看,这很好,但在类似c的情况下,你会得到
这个怎么样?
1 2 3 | isFloat(num) { return typeof num ==="number" && !Number.isInteger(num); } |
这个解决方案对我有效。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <html> <body> <form method="post" action="#"> <input type="text" id="number_id"/> <input type="submit" value="send"/> </form> <p id="message"> </p> var flt=document.getElementById("number_id").value; if(isNaN(flt)==false && Number.isInteger(flt)==false) { document.getElementById("message").innerHTML="the number_id is a float"; } else { document.getElementById("message").innerHTML="the number_id is a Integer"; } </body> </html> |
不必那么复杂。整数的parseFloat()和parseInt()等价物的数值将相同。因此,您可以这样做:
1 2 3 | function isInt(value){ return (parseFloat(value) == parseInt(value)) && !isNaN(value); } |
然后
1 | if (isInt(x)) // do work |
这也将允许字符串检查,因此不严格。如果需要强类型解决方案(aka,不适用于字符串):
1 | function is_int(value){ return !isNaN(parseInt(value * 1) } |
这是检查int和float的最终代码
1 2 3 4 5 6 7 | function isInt(n) { if(typeof n == 'number' && Math.Round(n) % 1 == 0) { return true; } else { return false; } } |
或
1 2 3 | function isInt(n) { return typeof n == 'number' && Math.Round(n) % 1 == 0; } |
1 2 3 4 5 6 7 8 9 10 11 | function isInteger(n) { return ((typeof n==='number')&&(n%1===0)); } function isFloat(n) { return ((typeof n==='number')&&(n%1!==0)); } function isNumber(n) { return (typeof n==='number'); } |
我在这里尝试了一些答案,最后写下了这个解决方案。这也适用于字符串中的数字。
1 2 3 4 5 6 7 8 9 | function isInt(number) { if(!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false; return !(number - parseInt(number)); } function isFloat(number) { if(!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false; return number - parseInt(number) ? true : false; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | var tests = { 'integer' : 1, 'float' : 1.1, 'integerInString' : '5', 'floatInString' : '5.5', 'negativeInt' : -345, 'negativeFloat' : -34.98, 'negativeIntString' : '-45', 'negativeFloatString' : '-23.09', 'notValidFalse' : false, 'notValidTrue' : true, 'notValidString' : '45lorem', 'notValidStringFloat' : '4.5lorem', 'notValidNan' : NaN, 'notValidObj' : {}, 'notValidArr' : [1,2], }; function isInt(number) { if(!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false; return !(number - parseInt(number)); } function isFloat(number) { if(!/^["|']{0,1}[-]{0,1}\d{0,}(\.{0,1}\d+)["|']{0,1}$/.test(number)) return false; return number - parseInt(number) ? true : false; } function testFunctions(obj) { var keys = Object.keys(obj); var values = Object.values(obj); values.forEach(function(element, index){ console.log(`Is ${keys[index]} (${element}) var an integer? ${isInt(element)}`); console.log(`Is ${keys[index]} (${element}) var a float? ${isFloat(element)}`); }); } testFunctions(tests); |
我编写了接受字符串的函数(如果有人需要的话)
1 2 3 4 5 6 7 | function isInt(x) { return !isNaN(x) && eval(x).toString().length == parseInt(eval(x)).toString().length } function isFloat(x) { return !isNaN(x) && !isInt(eval(x)) && x.toString().length > 0 } |
示例输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | console.log(isFloat('0.2')) // true console.log(isFloat(0.2)) // true console.log(isFloat('.2')) // true console.log(isFloat('-.2')) // true console.log(isFloat(-'.2')) // true console.log(isFloat(-.2)) // true console.log(isFloat('u.2')) // false console.log(isFloat('2')) // false console.log(isFloat('0.2u')) // false console.log(isInt('187')) // true console.log(isInt(187)) // true console.log(isInt('1.2')) // false console.log(isInt('-2')) // true console.log(isInt(-'1')) // true console.log(isInt('10e1')) // true console.log(isInt(10e1)) // true |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | try this one function amountcheck() { var dpamt=$('#dpamt').val()/5000; var ints=dpamt.toString(); var isint=ints.split('.'); if(isint[1]>0) { alert('float value'); return false; } else { alert('int value'); } } |
我喜欢这个小函数,它对正整数和负整数都返回真:
1 2 3 | function isInt(val) { return ["string","number"].indexOf(typeof(val)) > -1 && val !== '' && !isNaN(val+".0"); } |
这是因为1或"1"变为"1.0",即isnan()返回false(然后求反并返回),但1.0或"1.0"变为"1.0.0",而"string"变为"string.0",两者都不是数字,因此isnan()返回false(再次求反)。
如果你只想要正整数,有一个变量:
1 2 3 | function isPositiveInt(val) { return ["string","number"].indexOf(typeof(val)) > -1 && val !== '' && !isNaN("0"+val); } |
或者,对于负整数:
1 2 3 | function isNegativeInt(val) { return `["string","number"].indexOf(typeof(val)) > -1` && val !== '' && isNaN("0"+val); } |
ispositiveInt()通过将连接的数字字符串移动到要测试的值之前来工作。例如,ispositiveInt(1)会导致isnan()计算"01",其计算结果为false。同时,ispositiveInt(-1)导致isnan()计算"0-1",计算结果为true。我们否定了返回值,这就给了我们想要的。isnegativeint()的工作原理类似,但不否定isnan()的返回值。
编辑:
我最初的实现还将在数组和空字符串上返回true。这个实现没有这个缺陷。如果val不是字符串或数字,或者它是空字符串,那么它也有提前返回的好处,在这些情况下,它会更快地返回。您可以用替换前两个子句来进一步修改它。
1 | typeof(val) !="number" |
如果您只想匹配文字数字(而不是字符串)
编辑:
我还不能发表评论,所以我要把它添加到我的答案中。@asok发布的基准测试信息非常丰富;但是,最快的函数不符合要求,因为它还返回了float、array、booleans和空字符串的true。
我创建了以下测试套件来测试每个函数,并将我的答案添加到列表中(函数8解析字符串,函数9不解析字符串):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | funcs = [ function(n) { return n % 1 == 0; }, function(n) { return typeof n === 'number' && n % 1 == 0; }, function(n) { return typeof n === 'number' && parseFloat(n) == parseInt(n, 10) && !isNaN(n); }, function(n) { return n.toString().indexOf('.') === -1; }, function(n) { return n === +n && n === (n|0); }, function(n) { return parseInt(n) === n; }, function(n) { return /^-?[0-9]+$/.test(n.toString()); }, function(n) { if ((undefined === n) || (null === n)) { return false; } if (typeof n == 'number') { return true; } return !isNaN(n - 0); }, function(n) { return ["string","number"].indexOf(typeof(n)) > -1 && n !== '' && !isNaN(n+".0"); } ]; vals = [ [1,true], [-1,true], [1.1,false], [-1.1,false], [[],false], [{},false], [true,false], [false,false], [null,false], ["",false], ["a",false], ["1",null], ["-1",null], ["1.1",null], ["-1.1",null] ]; for (var i in funcs) { var pass = true; console.log("Testing function"+i); for (var ii in vals) { var n = vals[ii][0]; var ns; if (n === null) { ns = n+""; } else { switch (typeof(n)) { case"string": ns ="'" + n +"'"; break; case"object": ns = Object.prototype.toString.call(n); break; default: ns = n; } ns ="("+typeof(n)+")"+ns; } var x = vals[ii][1]; var xs; if (x === null) { xs ="(ANY)"; } else { switch (typeof(x)) { case"string": xs ="'" + n +"'"; break; case"object": xs = Object.prototype.toString.call(x); break; default: xs = x; } xs ="("+typeof(x)+")"+xs; } var rms; try { var r = funcs[i](n); var rs; if (r === null) { rs = r+""; } else { switch (typeof(r)) { case"string": rs ="'" + r +"'"; break; case"object": rs = Object.prototype.toString.call(r); break; default: rs = r; } rs ="("+typeof(r)+")"+rs; } var m; var ms; if (x === null) { m = true; ms ="N/A"; } else if (typeof(x) == 'object') { m = (xs === rs); ms = m; } else { m = (x === r); ms = m; } if (!m) { pass = false; } rms ="Result:"+rs+", Match:"+ms; } catch (e) { rms ="Test skipped; function threw exception!" } console.log(" Value:"+ns+", Expect:"+xs+","+rms); } console.log(pass ?"PASS!" :"FAIL!"); } |
我还重新运行基准,并将函数8添加到列表中。我不会发布结果,因为它们有点令人尴尬(例如,函数不快)。
(删节了——我删除了成功的测试,因为输出很长)结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | Testing function 0 Value: (object) [object Array], Expect: (boolean) false, Result: (boolean) true, Match: false Value: (boolean) true, Expect: (boolean) false, Result: (boolean) true, Match: false Value: (boolean) false, Expect: (boolean) false, Result: (boolean) true, Match: false Value: null, Expect: (boolean) false, Result: (boolean) true, Match: false Value: (string) '', Expect: (boolean) false, Result: (boolean) true, Match: false Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A FAIL! Testing function 1 Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A PASS! Testing function 2 Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A PASS! Testing function 3 Value: (object) true, Expect: (boolean) false, Result: (boolean) true, Match: false Value: (object) false, Expect: (boolean) false, Result: (boolean) true, Match: false Value: (boolean) [object Array], Expect: (boolean) false, Result: (boolean) true, Match: false Value: (boolean) [object Object], Expect: (boolean) false, Result: (boolean) true, Match: false Value: null, Expect: (boolean) false, Test skipped; function threw exception! Value: (string) '', Expect: (boolean) false, Result: (boolean) true, Match: false Value: (string) 'a', Expect: (boolean) false, Result: (boolean) true, Match: false Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A FAIL! Testing function 4 Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A PASS! Testing function 5 Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A PASS! Testing function 6 Value: null, Expect: (boolean) false, Test skipped; function threw exception! Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A PASS! Testing function 7 Value: (number) 1.1, Expect: (boolean) false, Result: (boolean) true, Match: false Value: (number) -1.1, Expect: (boolean) false, Result: (boolean) true, Match: false Value: (object) true, Expect: (boolean) false, Result: (boolean) true, Match: false Value: (boolean) [object Array], Expect: (boolean) false, Result: (boolean) true, Match: false Value: (boolean) [object Object], Expect: (boolean) false, Result: (boolean) true, Match: false Value: (string) '', Expect: (boolean) false, Result: (boolean) true, Match: false Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '1.1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '-1.1', Expect: (ANY), Result: (boolean) true, Match: N/A FAIL! Testing function 8 Value: (string) '1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '-1', Expect: (ANY), Result: (boolean) true, Match: N/A Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A PASS! Testing function 9 Value: (string) '1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '1.1', Expect: (ANY), Result: (boolean) false, Match: N/A Value: (string) '-1.1', Expect: (ANY), Result: (boolean) false, Match: N/A PASS! |
我把失败留给了你,这样你就可以看到每个函数在哪里失败,以及(字符串)测试,这样你就可以看到每个函数如何处理字符串中的整数和浮点值,因为有些函数可能希望这些值被解析为数字,而有些则不希望。
在测试的10个功能中,真正符合OP要求的是[1,3,5,6,8,9]
这是我的密码。它检查以确保它不是空字符串(否则将传递),然后将其转换为数字格式。现在,取决于您是否希望"1.1"等于1.1,这可能是您要查找的内容,也可能不是。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var isFloat = function(n) { n = n.length > 0 ? Number(n) : false; return (n === parseFloat(n)); }; var isInteger = function(n) { n = n.length > 0 ? Number(n) : false; return (n === parseInt(n)); }; var isNumeric = function(n){ if(isInteger(n) || isFloat(n)){ return true; } return false; }; |
对于整数,我使用这个
1 2 3 4 5 6 7 8 9 | function integer_or_null(value) { if ((undefined === value) || (null === value)) { return null; } if(value % 1 != 0) { return null; } return value; } |
对于那些好奇的人,我使用benchmark.js在本文中测试了投票最多的答案(以及今天发布的答案),下面是我的结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | var n = -10.4375892034758293405790; var suite = new Benchmark.Suite; suite // kennebec .add('0', function() { return n % 1 == 0; }) // kennebec .add('1', function() { return typeof n === 'number' && n % 1 == 0; }) // kennebec .add('2', function() { return typeof n === 'number' && parseFloat(n) == parseInt(n, 10) && !isNaN(n); }) // Axle .add('3', function() { return n.toString().indexOf('.') === -1; }) // Dagg Nabbit .add('4', function() { return n === +n && n === (n|0); }) // warfares .add('5', function() { return parseInt(n) === n; }) // Marcio Simao .add('6', function() { return /^-?[0-9]+$/.test(n.toString()); }) // Tal Liron .add('7', function() { if ((undefined === n) || (null === n)) { return false; } if (typeof n == 'number') { return true; } return !isNaN(n - 0); }); // Define logs and Run suite.on('cycle', function(event) { console.log(String(event.target)); }).on('complete', function() { console.log('Fastest is ' + this.filter('fastest').pluck('name')); }).run({ 'async': true }); |
1 2 3 4 5 6 7 8 9 10 | 0 x 12,832,357 ops/sec ±0.65% (90 runs sampled) 1 x 12,916,439 ops/sec ±0.62% (95 runs sampled) 2 x 2,776,583 ops/sec ±0.93% (92 runs sampled) 3 x 10,345,379 ops/sec ±0.49% (97 runs sampled) 4 x 53,766,106 ops/sec ±0.66% (93 runs sampled) 5 x 26,514,109 ops/sec ±2.72% (93 runs sampled) 6 x 10,146,270 ops/sec ±2.54% (90 runs sampled) 7 x 60,353,419 ops/sec ±0.35% (97 runs sampled) Fastest is 7 Tal Liron |
在Java脚本中,所有的数字都是EDCOX1,5,和Java中的双一样。在javascript中没有不同的类型,所有类型都由类型
浮动验证条件:
1 | if (lnk.value == +lnk.value && lnk.value != (lnk.value | 0)) |
整数验证条件:
1 | if (lnk.value == +lnk.value && lnk.value == (lnk.value | 0)) |
希望这会有所帮助。
YourJS提供了以下两种功能,适用于所有数字,包括返回
1 2 3 4 5 6 7 | function isFloat(x) { return typeOf(x, 'Number') && !!(x % 1); } function isInt(x) { return typeOf(x, 'Number') && x % 1 == 0; } |
由于
这可能不如%答案的性能好,这会阻止您首先转换为字符串,但我还没有看到有人发布它,因此这里有另一个选项可以很好地工作:
1 2 3 | function isInteger(num) { return num.toString().indexOf('.') === -1; } |
1 2 3 4 5 6 7 | function int(a) { return a - a === 0 && a.toString(32).indexOf('.') === -1 } function float(a) { return a - a === 0 && a.toString(32).indexOf('.') !== -1 } |
如果要排除字符串,可以添加
有时,数字对象不允许直接使用mod运算符(%),如果您正面临这种情况,可以使用此解决方案。
1 2 3 4 5 6 7 8 | if(object instanceof Number ){ if( ((Number) object).doubleValue() % 1 == 0 ){ //your object is an integer } else{ //your object is a double } } |
基于我在这里所看到的一切,我创建了自己的一组函数来测试我需要的东西:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | function NumberValidator() { this.isFloat = function (n) { return typeof(n)==="number" && n === +n && Math.round(n) !== n; }; this.isInteger = function (n) { return typeof(n)==="number" && n === +n && Math.round(n) === n; }; this.isFloatOrInteger = function (n) { return this.isFloat(n) || this.isInteger(n); }; this.isNonZeroFloatOrInteger = function (n) { return this.isFloatOrInteger(n) && n > 0; }; this.isNonZeroInteger = function (n) { return this.isInteger(n) && n > 0; }; } |
然而,Shime的解决方案更短,检查更少,因此它可能是更好的解决方案。
根据战争解答的启发,我使用这个来验证一条输入。
1 2 3 4 5 6 7 8 9 10 11 12 13 | function validLatLng(n) { var isInt = function(n) { return parseInt(n) == n }; var isFloat = function(n) { return parseFloat(n) == n }; // For testing console.log("validLatLng::n", n); console.log("validLatLng::parseInt", parseInt(n)); console.log("validLatLng::parseFloat", parseFloat(n)); console.log("validLatLng::isInt", isInt(n)); console.log("validLatLng::isFloat", isFloat(n)); return isInt(n) || isFloat(n); } |
你可以用这个在控制台上测试
ZZU1
我需要检查一个输入值,如果它是整型或浮点型的,为此我想出了以下方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | function isInteger(x) { var integer = parseInt(x, 10); if (!isNaN(integer) && !isFloat(x)) { return true; } return false; } function isFloat(x) { var f = parseFloat(x); var floor = Math.floor(f); var fraction = f - floor; if (fraction > 0) { return true; } return false; } var cases = [ "1", "1.00", "1.01", "0.05", "ab1", "ab1.1", 1, 1.00, 1.01, 0.05, 1e+5, "", true, false, null, NaN, undefined, ]; console.log("isInteger()"); for (var i = 0; i < cases.length; i++) { console.log(cases[i], isInteger(cases[i])); } console.log(" isFloat()"); for (var i = 0; i < cases.length; i++) { console.log(cases[i], isFloat(cases[i])); } |
下面的函数防止空字符串、取消定义、空值和最大/最小值范围。Javascript引擎应该从第一天开始就内置了这些函数。:)
享受!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | function IsInteger(iVal) { var iParsedVal; //our internal converted int value iParsedVal = parseInt(iVal,10); if (isNaN(iParsedVal) || Infinity == iParsedVal || -Infinity == iParsedVal) //sanity check - guard against empty strings and max/min values return false; else return Number(iVal) === (iParsedVal | 0); //the 2nd operand group (intValue | 0), evaluates to true only if the intValue is an integer; so an int type will only return true } function IsFloat(fVal) { var fParsedVal; //our internal converted float value fParsedVal = parseFloat(fVal); if (isNaN(fParsedVal) || Infinity == fParsedVal || -Infinity == fParsedVal) //sanity check - guard against empty strings and max/min values return false; else return !!(fVal % 1); //true only if there is a fractional value after the mod op; the !! returns the opposite value of the op which reflects the function's return value } |
这是我的:
1 2 3 4 5 6 7 8 | function isInt(quale) { var valore = $('#'+quale).val().toLowerCase(); if (isNaN(Number(String(valore))) || (valore.indexOf("e") > 0)) { // Not int } else { // Is Int! } } |
而这:
1 2 3 4 5 6 7 8 9 | function isFloat(quale) { var valore = $('#'+quale).val(); valore = valore.replace(",",""); if (isNaN(String(valore)) || (valore.indexOf("e") > 0)) { // Not Float } else { // Float } } |
广告!
我觉得这是最优雅的方式:
1 2 3 | function isInteger(n) { return n === (n^0); } |
它还关心在非数字值的情况下返回false。
另一种方法是:
1 2 3 | function isFloat(float) { return /\./.test(float.toString()); } |
可能不如其他方法有效,但另一种方法完全相同。
1 | parseInt(yourNumber)=== parseFloat(yourNumber) |