मुझे यह छोटा कार्य पसंद है, जो सकारात्मक और नकारात्मक पूर्णांक दोनों के लिए सच होगा:
function isInt(val) {
return ["string","number"].indexOf(typeof(val)) > -1 && val !== '' && !isNaN(val+".0");
}
यह काम करता है क्योंकि 1 या "1" "1.0" हो जाता है, जो कि NNN () गलत है (जो हम तब नकारात्मक करते हैं और वापस लौटते हैं), लेकिन 1.0 या "1.0" "1.0.0" बन जाता है, जबकि "स्ट्रिंग" "स्ट्रिंग" बन जाता है। 0 ", जिनमें से कोई भी संख्या नहीं है, इसलिए NNN () गलत है (और, फिर से, नकारात्मक हो जाता है) देता है।
यदि आप केवल सकारात्मक पूर्णांक चाहते हैं, तो यह संस्करण है:
function isPositiveInt(val) {
return ["string","number"].indexOf(typeof(val)) > -1 && val !== '' && !isNaN("0"+val);
}
या, नकारात्मक पूर्णांक के लिए:
function isNegativeInt(val) {
return `["string","number"].indexOf(typeof(val)) > -1` && val !== '' && isNaN("0"+val);
}
isPositiveInt () परीक्षण किए जाने वाले मान से आगे समवर्ती संख्यात्मक स्ट्रिंग को स्थानांतरित करके काम करता है। उदाहरण के लिए, isPositiveInt (1) परिणाम isNaN () "01" का मूल्यांकन करता है, जो गलत का मूल्यांकन करता है। इस बीच, isPositiveInt (-1) परिणाम isNaN () "0-1" का मूल्यांकन करता है, जो सही मूल्यांकन करता है। हम रिटर्न वैल्यू को नकारते हैं और इससे हमें वह मिलता है जो हम चाहते हैं। isNegativeInt () समान रूप से काम करता है, लेकिन isNaN () के रिटर्न मान की उपेक्षा किए बिना।
संपादित करें:
मेरा मूल कार्यान्वयन सरणियों और खाली तारों पर भी सही लौटेगा। इस कार्यान्वयन डो में वह दोष नहीं है। यदि घाटी एक स्ट्रिंग या संख्या नहीं है, या यदि यह एक खाली स्ट्रिंग है, तो इन मामलों में तेजी से वापस लौटने पर इसका लाभ भी है। आप पहले दो खंडों को बदलकर इसे और संशोधित कर सकते हैं
typeof(val) != "number"
यदि आप केवल शाब्दिक संख्याओं से मेल खाना चाहते हैं (और तार नहीं)
संपादित करें:
मैं अभी तक टिप्पणी पोस्ट नहीं कर सकता, इसलिए मैं इसे अपने उत्तर में जोड़ रहा हूं। @Asok द्वारा पोस्ट किया गया बेंचमार्क बहुत जानकारीपूर्ण है; हालाँकि, सबसे तेज़ फ़ंक्शन आवश्यकताओं के अनुकूल नहीं है, क्योंकि यह फ़्लोट, सरणियों, बूलियन और खाली तारों के लिए TRUE भी लौटाता है।
मैंने प्रत्येक फ़ंक्शन का परीक्षण करने के लिए निम्नलिखित परीक्षण सूट बनाया, सूची में अपना उत्तर जोड़कर, (फ़ंक्शन 8, जो तार तार करता है, और फ़ंक्शन 9, जो नहीं करता है):
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 फ़ंक्शन के साथ बेंचमार्क को सूची में जोड़ा गया। मैं परिणाम पोस्ट नहीं करूंगा, क्योंकि वे थोड़े शर्मनाक हैं (जैसे कि फ़ंक्शन तेज़ नहीं है) ...
संक्षिप्त (संक्षिप्त - मैंने सफल परीक्षण हटा दिए हैं, क्योंकि आउटपुट काफी लंबा है) परिणाम निम्नानुसार हैं:
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 कार्यों में से, जो वास्तव में ओपी की आवश्यकताओं को पूरा करते हैं, वे हैं [1,3,5,6,8,9]
<nit-pick>
जावास्क्रिप्ट में अलग-अलग पूर्णांक और फ्लोट न्यूमेरिक प्रकार नहीं हैं। जावास्क्रिप्ट में हर संख्या सिर्फ एक हैNumber
।</nit-pick>