पुष्टि करें कि एक स्ट्रिंग एक सकारात्मक पूर्णांक है


200

मैं यह जांचने के लिए सबसे सरल असफल-सुरक्षित परीक्षण चाहूंगा कि जावास्क्रिप्ट में एक स्ट्रिंग एक पूर्णांक है।

isNaN(str)सभी प्रकार के गैर-पूर्णांक मानों के लिए सही रिटर्न और parseInt(str)फ्लोट स्ट्रिंग्स के लिए पूर्णांक लौटा रहा है, जैसे "2.5"। और मैं कुछ jQuery प्लगइन या तो उपयोग नहीं करना चाहता।


7
क्या आप "+2" की अनुमति देते हैं? "0.1e1" के बारे में कैसे? "1.0000" के बारे में कैसे?
फ़रोज़

isNaN()समारोह तरीका यह होता है क्योंकि अवधारणा बर्ताव करता है Not a Numberआईईईई 794 चल बिन्दु विनिर्देश में एक बहुत ही विशेष अर्थ नहीं है। यह सरल बोलचाल के सवाल का जवाब देने का इरादा नहीं करता है, "क्या यह मूल्य एक संख्या नहीं है?"
पॉइन्टी

3
सवाल अतिवादी है। आप यह पुष्टि नहीं कर सकते कि "एक स्ट्रिंग एक पूर्णांक है", क्योंकि ऐसी कोई चीज नहीं है - कोई भी वस्तु एक ही समय में एक स्ट्रिंग और एक संख्या नहीं हो सकती है। आप शायद "कैसे परीक्षण करने के लिए अगर एक स्ट्रिंग एक पूर्णांक का एक वैध प्रतिनिधित्व है" का मतलब है, लेकिन इसका जवाब देने के लिए हमें यह जानना होगा कि आप किस भाषा या "संस्कृति" के बारे में बात कर रहे हैं। उदाहरण के लिए, ٢‎٣٤या MCMXIXदोनों वैध पूर्णांक निरूपण हैं, लेकिन मुझे नहीं लगता कि आप एक ऐसे कोड की तलाश कर रहे हैं जो इन पार्स करने में सक्षम हो। क्या आप निर्दिष्ट कर सकते हैं कि आप किस संख्या प्रारूप का समर्थन करने जा रहे हैं, क्योंकि लोग इसके बारे में भ्रमित हैं।
जॉर्ज 14

5
मुझे लगता है कि 'अति से अस्पष्ट' अपने आप में थोड़ा चरम है; लेकिन फिर भी ... संदर्भ एक अंग्रेजी बोलने वाले देश में इस्तेमाल की जाने वाली खरीदारी की टोकरी पर मात्रा इनपुट क्षेत्र का सत्यापन है, इसलिए केवल पश्चिमी अंक। "सकारात्मक" से मेरा मतलब शून्य से अधिक था। क्या मैं निम्नलिखित स्वीकार करूंगा: "+2" हाँ, "0.1e1" नहीं, "1.000" निश्चित रूप से क्यों नहीं। हालाँकि, यदि आप एक उत्तर प्रदान कर सकते हैं जिसे इन विभिन्न विशिष्ट परिदृश्यों को शामिल करने / शामिल करने के लिए समायोजित किया जा सकता है तो मैं आपको अतिरिक्त उतार देने का वादा करता हूं (और मुझे यकीन है कि अन्य लोग भी करेंगे)।
मिक बायरन

जवाबों:


296

आपके लिए दो उत्तर:

  • पार्सिंग के आधार पर

  • नियमित अभिव्यक्ति

ध्यान दें कि दोनों मामलों में, मैंने "सकारात्मक पूर्णांक" को शामिल करने के लिए व्याख्या की है 0, भले ही 0सकारात्मक न हो। यदि आप अस्वीकार करना चाहते हैं तो मैं नोट्स शामिल करता हूं 0

परसिंग के आधार पर

यदि आप चाहते हैं कि यह उचित मानों पर एक सामान्यीकृत दशमलव पूर्णांक स्ट्रिंग हो, तो आप यह कर सकते हैं:

function isNormalInteger(str) {
    var n = Math.floor(Number(str));
    return n !== Infinity && String(n) === str && n >= 0;
}

या यदि आप व्हाट्सएप और प्रमुख शून्य की अनुमति देना चाहते हैं:

function isNormalInteger(str) {
    str = str.trim();
    if (!str) {
        return false;
    }
    str = str.replace(/^0+/, "") || "0";
    var n = Math.floor(Number(str));
    return n !== Infinity && String(n) === str && n >= 0;
}

लाइव परीक्षण (प्रमुख शून्य या व्हाट्सएप को संभालने के बिना):

लाइव टेस्टेड ( अग्रणी शून्य और व्हाट्सएप के लिए हैंडलिंग के साथ ):

यदि आप अस्वीकार करना चाहते हैं 0, तो बस बदल >= 0दें > 0। (या, उस संस्करण में जो अग्रणी शून्य की अनुमति देता है, लाइन || "0"पर हटा दें replace।)

यह कैसे काम करता है:

  1. व्हॉट्सएप और अग्रणी शून्य की अनुमति देने वाले संस्करण में:

    • str = str.trim(); किसी भी अग्रणी और पीछे आने वाले व्हाइटपेस को हटा देता है।
    • if (!str) एक रिक्त स्ट्रिंग और रिटर्न पकड़ता है, बाकी काम करने का कोई मतलब नहीं है।
    • str = str.replace(/^0+/, "") || "0"; स्ट्रिंग से सभी प्रमुख 0 को हटाता है - लेकिन अगर वह रिक्त स्ट्रिंग में परिणाम करता है, तो एक 0 को पुनर्स्थापित करता है।
  2. Number(str): strएक संख्या में परिवर्तित ; संख्या में भिन्नात्मक भाग हो सकता है, या हो सकता है NaN

  3. Math.floor: संख्या को काटें (किसी भिन्नात्मक भाग को काटें)।

  4. String(...): परिणाम को वापस सामान्य दशमलव स्ट्रिंग में परिवर्तित करता है। वास्तव में बड़ी संख्या के लिए, यह वैज्ञानिक संकेतन पर जाएगा, जो इस दृष्टिकोण को तोड़ सकता है। (मुझे नहीं पता कि विभाजन कहां है, विवरण कल्पना में है , लेकिन पूरे संख्याओं के लिए, मेरा मानना ​​है कि यह उस बिंदु पर है जो आपने 21 अंकों को पार कर लिया है [जिस समय तक संख्या बहुत अधिक हो गई है, जैसा कि IEEE-754 दोहरे सटीक संख्याओं में केवल सटीकता के 15 अंक होते हैं ..)

  5. ... === str: मूल स्ट्रिंग की तुलना में।

  6. n >= 0: जांचें कि यह सकारात्मक है।

ध्यान दें कि यह इनपुट के लिए विफल रहता है "+1", वैज्ञानिक संकेतन में कोई भी इनपुट जो String(...)मंच पर एक ही वैज्ञानिक संकेतन में वापस नहीं आता है , और किसी भी मूल्य के लिए जो जावास्क्रिप्ट का उपयोग करता है (IEEE-754 डबल-परिशुद्धता बाइनरी फ्लोटिंग पॉइंट) सही ढंग से यह नहीं दर्शा सकता है कि दिए गए से अलग मूल्य के रूप में कौन सा पर्स (जिसमें 9,007,199,254,740,992 से अधिक पूर्णांक शामिल हैं; उदाहरण के लिए, 1234567890123456789विफल हो जाएगा)। पूर्व एक आसान तय है, बाद के दो इतना नहीं है।

नियमित अभिव्यक्ति

अन्य दृष्टिकोण एक नियमित अभिव्यक्ति के माध्यम से स्ट्रिंग के पात्रों का परीक्षण करना है, यदि आपका लक्ष्य सिर्फ सामान्य दशमलव प्रारूप में या +तो 0एक स्ट्रिंग या उसके बाद एक वैकल्पिक अनुमति देना है (कहें) :

function isNormalInteger(str) {
    return /^\+?(0|[1-9]\d*)$/.test(str);
}

लाइव परीक्षण:

यह कैसे काम करता है:

  1. ^: स्ट्रिंग का मैच शुरू

  2. \+?: एकल, वैकल्पिक की अनुमति दें +(यदि आप नहीं चाहते हैं तो इसे हटा दें)

  3. (?:...|...): इन दो विकल्पों में से एक को अनुमति दें (बिना एक कैप्चर ग्रुप बनाए):

    1. (0|...): 0इसके लिए अनुमति दें ...

    2. (...|[1-9]\d*): ... या 0दशमलव अंकों के किसी भी संख्या के अलावा और उसके बाद शुरू होने वाली संख्या।

  4. $: स्ट्रिंग का मैच अंत।

यदि आप अस्वीकार करना चाहते हैं 0(क्योंकि यह सकारात्मक नहीं है), तो नियमित अभिव्यक्ति बस बन जाती है /^\+?[1-9]\d*$/(उदाहरण के लिए, हम उस विकल्प को खो सकते हैं जिसे हमें अनुमति देने की आवश्यकता थी 0)।

यदि आप अग्रणी शून्य (0123, 00524) की अनुमति देना चाहते हैं, तो बस विकल्प को इसके (?:0|[1-9]\d*)साथ बदलें\d+

function isNormalInteger(str) {
    return /^\+?\d+$/.test(str);
}

आप सफेद स्थान को अनुमति देने के लिए चाहते हैं, जोड़ने \s*के तुरंत बाद ^और \s*बस से पहले $

ध्यान दें कि जब आप इसे एक नंबर में परिवर्तित करते हैं: आधुनिक इंजनों पर इसका उपयोग करना +strया Number(str)करना ठीक होगा, लेकिन पुराने लोग उन्हें गैर-मानक (लेकिन पूर्व-अनुमति प्राप्त) तरीके से विस्तारित कर सकते हैं जो कहते हैं कि एक अग्रणी शून्य का अर्थ है अष्टक (आधार 8), उदाहरण के लिए "010" => 8. एक बार जब आपने संख्या को मान्य कर लिया है, तो आप parseInt(str, 10)यह सुनिश्चित करने के लिए सुरक्षित रूप से उपयोग कर सकते हैं कि यह दशमलव (आधार 10) के रूप में है। parseIntस्ट्रिंग के अंत में कचरे को अनदेखा करेगा, लेकिन हमने सुनिश्चित किया है कि रेगेक्स के साथ कोई भी नहीं है।


दोनों Number(' ')और Number('')वापसी 0करते हुए लौट जाना NaNबजाय।
न्यूरिनो

@TJCrowder ठीक है, लेकिन मुझे किसी भी तरह से अस्वीकार करने के लिए '2a' जैसे तारों की आवश्यकता है , parseIntरिटर्न 2
न्यूरिनो

@neurino: /\D/.test('2a')सच है (क्योंकि एक गैर-अंक है)। तो शायद if (!/\D/.test(str) && !isNan((num = parseInt(str, 10))) { /* Valid number in num */}... मेरे सिर के ठीक ऊपर ...
TJ Crowder

प्रदर्शन बुद्धिमान, कौन सी विधि तेज होगी? या कौन सा उचित है?
फकवती

@phkavitha: जावास्क्रिप्ट प्रदर्शन के सवालों का जवाब लगभग हमेशा "यह निर्भर करता है" क्योंकि विभिन्न इंजन एक दूसरे से बहुत अलग हैं। आप jsperf.com का उपयोग करके अपने लक्ष्य इंजन / ब्राउज़रों का परीक्षण कर सकते हैं । मुझे नहीं लगता कि यह ऑपरेशन किसी दिए गए ऐप में अड़चन होने की संभावना है ... :-)
TJ Crowder

76

समाधान 1

यदि हम एक जावास्क्रिप्ट पूर्णांक को अधिकतम (यानी ) मान मानते हैं , तो निम्न संक्षिप्त समाधान पूरी तरह से काम करेगा:4294967295Math.pow(2,32)-1

function isPositiveInteger(n) {
    return n >>> 0 === parseFloat(n);
}

विवरण:

  1. शून्य-भरण दाएं शिफ्ट ऑपरेटर तीन महत्वपूर्ण काम करता है:
    • दशमलव भाग को काटता है
      • 123.45 >>> 0 === 123
    • नकारात्मक संख्याओं के लिए बदलाव करता है
      • -1 >>> 0 === 4294967295
    • की सीमा में "काम करता है" MAX_INT
      • 1e10 >>> 0 === 1410065408
      • 1e7 >>> 0 === 10000000
  2. parseFloatस्ट्रिंग नंबरों की सही पार्सिंग करता है ( NaNगैर संख्यात्मक स्ट्रिंग्स के लिए सेटिंग )

परीक्षण:

"0"                     : true
"23"                    : true
"-10"                   : false
"10.30"                 : false
"-40.1"                 : false
"string"                : false
"1234567890"            : true
"129000098131766699.1"  : false
"-1e7"                  : false
"1e7"                   : true
"1e10"                  : false
"1edf"                  : false
" "                     : false
""                      : false

डेमो: http://jsfiddle.net/5UCy4/37/


समाधान २

एक और तरीका है सभी संख्यात्मक मान जो करने के लिए वैध कर रहे हैं के लिए अच्छा है Number.MAX_VALUEके बारे में करने के लिए, यानी 1.7976931348623157e+308:

function isPositiveInteger(n) {
    return 0 === n % (!isNaN(parseFloat(n)) && 0 <= ~~n);
}

विवरण:

  1. !isNaN(parseFloat(n))फिल्टर करने के लिए प्रयोग किया जाता है शुद्ध स्ट्रिंग मान, जैसे "", " ", "string",
  2. 0 <= ~~nनकारात्मक और बड़े गैर-पूर्णांक मानों को फ़िल्टर करता है, उदाहरण "-40.1"के लिए "129000098131766699";
  3. (!isNaN(parseFloat(n)) && 0 <= ~~n)रिटर्न trueयदि मान दोनों है सांख्यिक और सकारात्मक ;
  4. 0 === n % (...)मान गैर-फ़्लोट होने पर जाँच करता है - यहाँ (...)(देखें 3) का मूल्यांकन किया जाता है जैसे 0के मामले में falseऔर के 1मामले में true

परीक्षण:

"0"                     : true
"23"                    : true
"-10"                   : false
"10.30"                 : false
"-40.1"                 : false
"string"                : false
"1234567890"            : true
"129000098131766699.1"  : false
"-1e10"                 : false
"1e10"                  : true
"1edf"                  : false
" "                     : false
""                      : false

डेमो: http://jsfiddle.net/5UCy4/14/


पिछला संस्करण:

function isPositiveInteger(n) {
    return n == "0" || ((n | 0) > 0 && n % 1 == 0);
}

डेमो: http://jsfiddle.net/5UCy4/2/


एक खाली स्ट्रिंग या बड़ी संख्या की कोशिश करें जैसे 1290000981231123.1 - jsfiddle.net/5UCy4/1
Niko

@gdoron वही है ~~val, जो आंशिक भाग को काट रहा है। यह थोड़ा तेज़ है क्योंकि दो के बजाय एक बिटवाइज़ ऑपरेशन करता है।
VisioN

बहुत बढ़िया जवाब। व्यक्तिगत तौर पर मैं पठनीयता के लिए अधिक वर्बोज़ एक सा जा रहा है एहसान होगा(!isNaN(parseFloat(n)) && n % 1 === 0 && 0 <= ~~n)
Ramy नस्र

true, false, 0xFF, और अन्य मूल्यों का isPositiveIntegerपता लगाए बिना इसे बनाते हैं ।
Xeoncross

1
यह एक भी गद्देदार शून्य (अच्छा!) को संभालता है। आप इसे अपने परीक्षणों में जोड़ सकते हैं।
राशेक

21

एक नियमित अभिव्यक्ति की तरह लग रहा है जाने के लिए रास्ता है:

var isInt = /^\+?\d+$/.test('the string');

बंद करें, जब तक कि "1.0" या ".1e1" की अनुमति न हो।
फ्रॉग्ज

खैर 1290000192379182379123782900192981231 एक पूर्णांक है, लेकिन यह जावास्क्रिप्ट मूल संख्याओं में वास्तव में प्रतिनिधित्व करने योग्य नहीं है, इसलिए regex के साथ यह अभी भी एक संख्यात्मक रूपांतरण करने और यह सत्यापित करने के लिए आवश्यक है कि यह काम किया है।
पॉइन्टी

यह बहुत ही अचूक उपाय है।
usr

@usr: मुझे लगता है कि यह अग्रणी है 0जहाँ आप सामान्य रूप से उम्मीद नहीं करेंगे, लेकिन अधिकांश भाग के लिए, ठीक लगता है।
टीजे क्राउडर

यह अधिकतम 2 ^ 31-1 की सीमा की जाँच नहीं करता है और यह अरबी अंकों की अनुमति नहीं देता है। यह एक हैक है, एक अच्छा समाधान नहीं है। सबसे अच्छा समाधान इस सवाल में सबसे ऊपर है। क्यों नहीं उस एक का उपयोग करें? यह हर लिहाज से बेहतर है।
usr

17

आधुनिक समाधान जो नोड में काम करता है और सभी ब्राउज़रों (आईई और ओपेरा मिनी को छोड़कर) के 90% से अधिक नंबर का उपयोग करता है। इसके बाद साधारण पॉजिटिव चेक का उपयोग किया जाता है।

Number.isInteger(x) && x > 0

इसे ECMAScript 2015 में अंतिम रूप दिया गया था ।

function isPositiveInteger(x) {
    return Number.isInteger(x) && x > 0
}

पॉलीफ़िल है:

Number.isInteger = Number.isInteger || function(value) {
  return typeof value === 'number' && 
    isFinite(value) && 
    Math.floor(value) === value;
};

यदि आपको ऐसे इनपुट का समर्थन करने की आवश्यकता है जो स्ट्रिंग या संख्या के रूप में हो सकते हैं, तो आप इस फ़ंक्शन का उपयोग कर सकते हैं, मैंने सभी मौजूदा उत्तरों (2/1/2018) के बाद एक बड़े परीक्षण सूट को लिखा था, जो इनपुट के कुछ रूप में विफल रहे।

function isPositiveInteger(v) {
  var i;
  return v && (i = parseInt(v)) && i > 0 && (i === v || ''+i === v);
}

4

यह इस एक के लिए लगभग एक नकली सवाल है:

जावास्क्रिप्ट में मान्य दशमलव संख्या - IsNumeric ()

इसका उत्तर है:

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

तो, एक सकारात्मक पूर्णांक होगा:

function isPositiveInteger(n) {
  var floatN = parseFloat(n);
  return !isNaN(floatN) && isFinite(n) && floatN > 0
      && floatN % 1 == 0;
}

मुझे पता है कि यह 'जावास्क्रिप्ट में संख्याओं की वैधता' प्रश्न के लिए लगभग एक डुप्लिकेट है, मैंने उस पूरी बात को पढ़ा, लेकिन मुझे लगा कि विशेष रूप से पूर्णांकों के स्ट्रिंग निरूपण के बारे में एक सवाल है जो इसके स्वयं के पेज का हकदार है।
मिक बायरन

2
return ((parseInt(str, 10).toString() == str) && str.indexOf('-') === -1);

यद्यपि आप '0001' जैसी स्ट्रिंग देते हैं तो यह काम नहीं करेगा


2

मेरा फ़ंक्शन जाँचता है कि क्या संख्या + ve है और दशमलव मान भी हो सकता है।

       function validateNumeric(numValue){
            var value = parseFloat(numValue);
            if (!numValue.toString().match(/^[-]?\d*\.?\d*$/)) 
                    return false;
            else if (numValue < 0) {
                return false;
            }
            return true;        
        }

2

बस ऊपर VisioN के उत्तर को बनाने के लिए, यदि आप jQuery सत्यापन प्लगइन का उपयोग कर रहे हैं, तो आप इसका उपयोग कर सकते हैं:

$(document).ready(function() {
    $.validator.addMethod('integer', function(value, element, param) {
        return (value >>> 0 === parseFloat(value) && value > 0);
    }, 'Please enter a non zero integer value!');
}

तब आप अपने सामान्य नियमों में इसका उपयोग कर सकते हैं या इसे गतिशील रूप से जोड़ सकते हैं:

$("#positiveIntegerField").rules("add", {required:true, integer:true});

2

सरल

function isInteger(num) {
  return (num ^ 0) === num;
}

console.log(isInteger(1));

आप संख्या का विस्तार भी कर सकते हैं और फ़ंक्शन को प्रोटोटाइप के माध्यम से असाइन कर सकते हैं।


1

यदि आप HTML5 फॉर्म का उपयोग कर रहे हैं, तो आप min="0"फॉर्म एलिमेंट के लिए विशेषता का उपयोग कर सकते हैं <input type="number" />। यह सभी प्रमुख ब्राउज़रों द्वारा समर्थित है। यह ऐसे सरल कार्यों के लिए जावास्क्रिप्ट को शामिल नहीं करता है, लेकिन नए HTML मानक में एकीकृत है। यह https://www.w3schools.com/tags/att_input_min.asp पर प्रलेखित है


0

(~~a == a)aस्ट्रिंग कहाँ है


1
यह ऋणात्मक संख्याओं के लिए विफल हो जाएगा: ~~"-1" == "-1"वापस आ जाएगा true। और ओपी ने केवल सकारात्मक पूर्णांक के लिए कहा।
इगोर मिली

1
'' और '' के लिए भी विफल रहता है।
neverfox

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.