JavaScript में दशमलव संख्याओं का सत्यापन: IsNumeric() कोड को क्यों तोड़ता है और इसे कैसे ठीक करें
\n\nहर डेवलपर जिसने कम से कम एक सप्ताह JavaScript में कोड लिखा है, उसे देर-सबेर इस कार्य का सामना करना पड़ा: "जाँच करें कि क्या स्ट्रिंग एक संख्या है।" लगता है, इससे आसान क्या हो सकता है? बिल्ट-इन फंक्शन isNaN() या parseFloat() — और काम खत्म। लेकिन ऐसा नहीं है। Stack Overflow पर प्रश्न "Validate decimal numbers in JavaScript — IsNumeric()" ने सैकड़ों हज़ारों व्यूज़ और दर्जनों विरोधाभासी उत्तर एकत्र किए हैं। क्यों? क्योंकि JavaScript एक ऐसी भाषा है जहाँ typeof NaN === 'number' है, और खाली स्ट्रिंग को शून्य माना जाता है।
इस लेख में हम केवल एक तैयार isNumeric() फंक्शन नहीं देंगे। हम 5 सबसे सामान्य और खतरनाक गलतियों का विश्लेषण करेंगे जो अनुभवी प्रोग्रामर भी करते हैं, और दिखाएंगे कि उनसे कैसे बचा जाए। आप जानेंगे कि isNaN एक जाल क्यों है, टाइप कन्वर्ज़न कैसे काम करता है, और प्रोडक्शन में वास्तव में JS में संख्या सत्यापन की कौन सी विधि उपयोग करनी चाहिए।
isNaN() बुराई क्यों है (और यह कब काम करता है)
\n\nआइए स्पष्ट से शुरू करते हैं। कई शुरुआती इस तरह लिखते हैं:
\n\nfunction isNumeric(n) {\n return !isNaN(n);\n}\n\n\nपहली नज़र में तार्किक है: यदि NaN नहीं है, तो संख्या है। लेकिन आइए परीक्षण करें:
\n\nconsole.log(isNumeric('123')); // true — ठीक\nconsole.log(isNumeric('12.3')); // true — ठीक\nconsole.log(isNumeric('')); // true — उफ़! खाली स्ट्रिंग एक संख्या?\nconsole.log(isNumeric(' ')); // true — स्पेस भी संख्या है?\nconsole.log(isNumeric(null)); // true — null एक संख्या है?\nconsole.log(isNumeric(true)); // true — true का मान 1 है\n\n\nगलती #1: isNaN() पहले आर्गुमेंट को संख्या में बदलता है, फिर जाँच करता है। खाली स्ट्रिंग '' 0 में बदल जाती है, null 0 में, true 1 में। परिणामस्वरूप, फंक्शन उन चीज़ों को संख्या मान लेता है जो संख्याएँ नहीं हैं।
एक सख्त विकल्प है — Number.isNaN() (ES6), लेकिन यह केवल यह जाँचता है कि मान NaN है या नहीं, बिना रूपांतरण के। संख्या सत्यापन के लिए यह भी उपयुक्त नहीं है।
parseFloat: नायक या खलनायक?
\n\nदूसरा लोकप्रिय तरीका parseFloat() का उपयोग करना है:
function isNumeric(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n}\n\n\nयह संस्करण बेहतर है, लेकिन इसकी एक अलग समस्या है:
\n\nconsole.log(isNumeric('123abc')); // true — parseFloat '123' ले लेगा, 'abc' को अनदेखा करेगा\nconsole.log(isNumeric('12.3.4')); // true — दूसरे डॉट को parseFloat नोटिस नहीं करेगा\nconsole.log(isNumeric('Infinity')); // true — अनंत एक संख्या है?\n\n\nगलती #2: parseFloat() स्ट्रिंग को पहले अमान्य कैरेक्टर तक पार्स करता है। स्ट्रिंग '123abc' उसके लिए 123 है। लेकिन उपयोगकर्ता ने गलती से एक अतिरिक्त कुंजी दबा दी होगी, और हमें इसे पकड़ना चाहिए।
गलती #3: isFinite() Infinity और -Infinity को हटा देता है, लेकिन NaN और undefined को छोड़ देता है। समस्या यह है कि isFinite(null) true लौटाता है, क्योंकि null 0 में बदल जाता है।
गलती #4: रेगुलर एक्सप्रेशन — रामबाण या नया नरक?
\n\nजब डेवलपर्स समझ जाते हैं कि बिल्ट-इन फंक्शन अविश्वसनीय हैं, तो वे अक्सर दूसरे चरम पर चले जाते हैं — रेगुलर एक्सप्रेशन। और यहाँ असली अराजकता शुरू होती है।
\n\nयहाँ एक सामान्य, लेकिन खतरनाक रेगुलर एक्सप्रेशन है:
\n\nfunction isNumeric(n) {\n return /^\\d+$/.test(n);\n}\n\n\nसमस्याएँ:
\n- \n
- दशमलव बिंदुओं को स्वीकार नहीं करता (
'12.3'— false) \n - ऋणात्मक संख्याओं को स्वीकार नहीं करता (
'-5'— false) \n - वैज्ञानिक संकेतन को स्वीकार नहीं करता (
'1e5'— false) \n
यहाँ "उ