जावास्क्रिप्ट में NaN को 0 में बदलें


238

क्या बिना विवरण के NaN मानों को 0 में बदलने का कोई तरीका है:

if (isNaN(a)) a = 0;

हर बार मेरे चर की जाँच करना बहुत कष्टप्रद होता है।


4
क्या आप इसे केवल एक फफूंद में बदल नहीं सकते हैं?
the_drow

यह केवल 20 पात्रों की तरह है, समस्या क्या है?
रस्टी फॉसक

1
function noNaN( n ) { return isNaN( n ) ? 0 : n; }और फिर बसnoNaN( a )
asटाइम विद

1
@rfausak आप आम तौर पर खुद को दोहराना नहीं चाहते हैं ( DRY देखें )। यदि एक निश्चित कार्यक्षमता की कई बार आवश्यकता होती है, तो एक समर्पित फ़ंक्शन पसंद किया जाता है।
49इम विद सिप

जवाबों:


575

तुम यह केर सकते हो:

a = a || 0

... जो कि किसी भी "फाल्सी" मूल्य से परिवर्तित हो जाएगा 0

"गलत" मान हैं:

  • false
  • null
  • undefined
  • 0
  • "" ( खाली स्ट्रिंग )
  • NaN (संख्या नहीं)

या यह अगर आप पसंद करते हैं:

a = a ? a : 0;

... जिसका ऊपर जैसा असर होगा।


यदि इरादे केवल अधिक से अधिक के लिए परीक्षण करना था NaN, तो आप ऐसा कर सकते हैं, लेकिन पहले toNumber रूपांतरण करें।

a = +a || 0

यह aएक संख्या में कनवर्ट करने का प्रयास करने के लिए unary + ऑपरेटर का उपयोग करता है । इसमें संख्यात्मक स्ट्रिंग्स जैसी चीजों '123'को एक संख्या में परिवर्तित करने का अतिरिक्त लाभ है ।

केवल अप्रत्याशित चीज हो सकती है यदि कोई व्यक्ति एक ऐरे से गुजरता है जिसे सफलतापूर्वक एक संख्या में परिवर्तित किया जा सकता है:

+['123']  // 123

यहाँ हमारे पास एक Array है जिसमें एक एकल सदस्य है जो एक संख्यात्मक स्ट्रिंग है। इसे सफलतापूर्वक एक नंबर में बदल दिया जाएगा।


सत्यापन को किसी फ़ंक्शन में बदलने का विचार अच्छा है, लेकिन यह अधिक सुरुचिपूर्ण है।
तमसे पाप सिप

1
@ बाकुदन: अच्छी बात है। मैं सोच रहा था कि ओपी केवल विशिष्ट NaNमूल्य से संबंधित था । यह सभी गैर-संख्या मानों के परीक्षण के रूप में काम नहीं करेगा। हालाँकि हम पहले एक toNumber रूपांतरण का प्रयास कर सकते थे। मैं अपडेट करूंगा।
user113716

... आह, यह "NaN कन्वर्ट करने के लिए" शीर्षक के कारण है । वैसे भी, अब दोनों तरह से कवर किया गया है।
user113716

2
धन्यवाद दोस्त, अपने आप के लिए यह एक a = 1 का चयन और संशोधित किया है || ०
कोई

बहुत बढ़िया। धन्यवाद
एपित जॉन इस्माइल २३'१ at को १६

32

डबल-टिल्ड (डबल बिटवाइज़ नहीं) का उपयोग करना - ~~- जावास्क्रिप्ट में कुछ दिलचस्प बातें करता है। उदाहरण के लिए आप इसका उपयोग कर सकते हैं Math.floorया इसके विकल्प के रूप में भी कर सकते हैं parseInt("123", 10)! यह वेब पर बहुत चर्चा की गई है, इसलिए मैं इसमें नहीं जाऊंगा कि यह यहां क्यों काम करता है, लेकिन यदि आप रुचि रखते हैं: जावास्क्रिप्ट में "डबल टिल्ड" (~~) ऑपरेटर क्या है?

हम NaNएक नंबर में बदलने के लिए एक डबल-टिल्ड की इस संपत्ति का शोषण कर सकते हैं , और खुशी से यह संख्या शून्य है!

console.log(~~NaN); // 0


1
धन्यवाद, मैं इस बारे में पता नहीं था ~~सब पर, मैं सिर्फ ओर के साथ यह प्रयोग किया जाता के साथ parseFloat()तो जैसे: ~~parseFloat($variable);। बहुत साफ :) +1
रेंस टिलमैन

23

अपनी स्वयं की विधि लिखें, और इसका उपयोग हर उस जगह करें जहाँ आप एक संख्या मान चाहते हैं:

function getNum(val) {
   if (isNaN(val)) {
     return 0;
   }
   return val;
}

1
अगर मैं इसमें पास हो जाता हूं nullतो यह मुझे अपेक्षित परिणाम नहीं देता 0। मेरी बात यहाँ और अधिक: stackoverflow.com/questions/115548/why-is-isnannull-false-in-js
आंद्रेई बाजनोव

2
इसके बाद के संस्करण के लिए मेरी टिप्पणी के बाद, मैंने Number(val)इसका उपयोग करने के बजाय इसे समाप्त कर दिया क्योंकि यह 0किसी भी तरह से इसका पता नहीं लगा सकता है।
आंद्रेई बाजानोव

4

कुछ के लिए कुछ सरल और प्रभावी:

function getNum(val) {
   val = +val || 0
   return val;
}

... जो कि किसी भी "फाल्सी" मूल्य से परिवर्तित हो जाएगा 0

"गलत" मान हैं:

  • false
  • null
  • undefined
  • 0
  • "" ( खाली स्ट्रिंग )
  • NaN (संख्या नहीं)

1
दिलचस्प! बस यह सोचकर कि यह कैसे प्रतिक्रिया देता है जब वैल एक नकारात्मक मूल्य हो सकता है। जहां तक ​​मैंने जांच की है कि इसमें कुछ भी गलत नहीं है, लेकिन सिर्फ मामले में ...
लुसियानो

2

इसे खत्म करने के बजाय आप इसे जारी रख सकते हैं, तो क्यों न पीछे हटें और आश्चर्य करें कि आप पहले स्थान पर NaN में क्यों भाग रहे हैं?

यदि किसी ऑपरेशन में कोई संख्यात्मक जानकारी NaN है, तो आउटपुट भी NaN होगा। यही कारण है कि वर्तमान IEEE फ़्लोटिंग पॉइंट मानक काम करता है (यह सिर्फ जावास्क्रिप्ट नहीं है)। यह व्यवहार एक अच्छे कारण के लिए है : अंतर्निहित इरादा आपको फर्जी परिणाम का उपयोग करने से रोकने के लिए है बिना यह समझे कि यह फर्जी है।

जिस तरह से NaN काम करता है अगर कुछ उप-उप-सब-ऑपरेशन (उस निचले स्तर पर NaN का निर्माण) में कुछ गलत हो जाता है, तो अंतिम परिणाम भी NaN होगा, जिसे आप तुरंत एक त्रुटि के रूप में भी पहचान सकते हैं त्रुटि हैंडलिंग तर्क (शायद फेंक / पकड़ें?) अभी तक पूरा नहीं हुआ है।

एक अंकगणितीय गणना के परिणाम के रूप में NaN हमेशा इंगित करता है कि अंकगणित के विवरण में कुछ गड़बड़ हो गया है। यह कंप्यूटर के लिए "डिबगिंग यहाँ आवश्यक" कहने का एक तरीका है। कुछ संख्या के साथ किसी भी तरह जारी रखने का कोई रास्ता खोजने के बजाय, यह शायद ही कभी सही है (0 वास्तव में आप क्या चाहते हैं?), समस्या क्यों नहीं ढूंढते और इसे ठीक करें।

जावास्क्रिप्ट में एक आम समस्या दोनों कि है parseInt(...)और parseFloat(...)NaN वापस आ जाएगी अगर एक अतर्कसंगत तर्क (दी null, '', आदि)। उच्च स्तर के बजाय समस्या को न्यूनतम स्तर पर ठीक करें। फिर समग्र गणना के परिणाम से समझ बनाने का अच्छा मौका है, और आप पूरी गणना के परिणाम के लिए कुछ मैजिक नंबर (0 या 1 या जो भी) प्रतिस्थापित नहीं कर रहे हैं। (की चाल (parseInt (foo.value)) || 0) केवल रकम के लिए काम करता है, उत्पादों के लिए नहीं - ऐसे उत्पादों के लिए जिन्हें आप चाहते हैं कि डिफ़ॉल्ट मान 0 के बजाय 1 हो, लेकिन यह नहीं कि यदि निर्दिष्ट मान वास्तव में 0. है)

शायद कोडिंग में आसानी के लिए आप उपयोगकर्ता से एक मान प्राप्त करना चाहते हैं, इसे साफ़ करें, और यदि आवश्यक हो तो एक डिफ़ॉल्ट मान प्रदान करें:

function getFoobarFromUser(elementid) {
        var foobar = parseFloat(document.getElementById(elementid).innerHTML)
        if (isNaN(foobar)) foobar = 3.21;       // default value
        return(foobar.toFixed(2));
}

2

रेगेक्स के बारे में कैसे ?

function getNum(str) {
  return /[-+]?[0-9]*\.?[0-9]+/.test(str)?parseFloat(str):0;
}

नीचे दिए गए कोड NaN को ठीक से दर्ज संख्याओं की गणना करने की अनुमति नहीं देंगे


2

यदि आप parseInt का उपयोग करने की कोशिश कर रहे हैं, तो NNN का उपयोग करने के तरीके काम नहीं करते हैं:

parseInt("abc"); // NaN
parseInt(""); // NaN
parseInt("14px"); // 14

लेकिन दूसरे मामले में NNN गलत उत्पादन करता है (यानी नल स्ट्रिंग एक संख्या है)

n="abc"; isNaN(n) ? 0 : parseInt(n); // 0
n=""; isNaN(n) ? 0: parseInt(n); // NaN
n="14px"; isNaN(n) ? 0 : parseInt(n); // 14

सारांश में, नल स्ट्रिंग isNaN द्वारा एक मान्य संख्या माना जाता है, लेकिन parseInt द्वारा नहीं। OSX Mojave पर सफारी, फ़ायरफ़ॉक्स और क्रोम के साथ सत्यापित।


1
एक स्पष्ट समाधान थोड़ा बोझिल है, parseInt के बाद NaN के लिए जाँच करें, इससे पहले नहीं: isNaN (parseInt (n))? parseInt (n): 0; // कॉल दो बार parseInt :(
डेविड क्रो 25

1
वह टिप्पणी (उत्तर) की शुरुआत होनी चाहिए!
दोपहर

एक अधिक कुशल समाधान मानता है कि अशक्त स्ट्रिंग एकमात्र विसंगति है: n == "" || isNaN (n)? 0: parseInt (n); (लेकिन क्या होगा अगर अन्य तार हैं?)
डेविड क्रो


0

उपयोगकर्ता 113716 समाधान का उपयोग करते हुए, जो कि उन सभी से बचने के लिए बहुत अच्छा है, अगर-और मैंने इसे पाठ बॉक्स इकाई और टेक्स्टबॉक्स मात्रा से मेरे उप-पाठ टेक्स्टबॉक्स की गणना करने के लिए इसे लागू किया है।

यूनिट और मात्रा टेक्स्टबॉक्स में गैर संख्याओं की प्रक्रिया लेखन में, उनके मूल्यों को शून्य से बदल दिया जाता है ताकि उपयोगकर्ता डेटा की अंतिम पोस्टिंग में कोई गैर-संख्या न हो।

     <script src="/common/tools/jquery-1.10.2.js"></script>
     <script src="/common/tools/jquery-ui.js"></script>

     <!----------------- link above 2 lines to your jquery files ------>





    <script type="text/javascript" >
    function calculate_subtotal(){

    $('#quantity').val((+$('#quantity').val() || 0));
    $('#unit').val((+$('#unit').val() || 0));

    var  calculated = $('#quantity').val() * $('#unit').val() ;
    $('#subtotal').val(calculated);


    }
    </script>


      <input type = "text" onChange ="calculate_subtotal();" id = "quantity"/>
      <input type = "text" onChange ="calculate_subtotal();" id = "unit"/>
      <input type = "text" id = "subtotal"/>

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