मैं जावास्क्रिप्ट के पार्सेंट ऑक्टल व्यवहार के आसपास कैसे काम कर सकता हूं?


282

जावास्क्रिप्ट में निम्नलिखित को निष्पादित करने का प्रयास करें:

parseInt('01'); //equals 1
parseInt('02'); //equals 2
parseInt('03'); //equals 3
parseInt('04'); //equals 4
parseInt('05'); //equals 5
parseInt('06'); //equals 6
parseInt('07'); //equals 7
parseInt('08'); //equals 0 !!
parseInt('09'); //equals 0 !!

मैंने सिर्फ इतना ही सीखा है कि जावास्क्रिप्ट को लगता है कि प्रमुख शून्य एक ऑक्टल पूर्णांक को इंगित करता है , और चूंकि कोई आधार "8"या "9"-8 नहीं है, इसलिए फ़ंक्शन शून्य हो जाता है। यह पसंद है या नहीं, यह डिजाइन द्वारा है

वर्कअराउंड क्या हैं?

नोट: पूर्णता के लिए, मैं एक समाधान पोस्ट करने वाला हूं, लेकिन यह एक ऐसा समाधान है, जिससे मुझे नफरत है, इसलिए कृपया अन्य / बेहतर उत्तर पोस्ट करें।


अपडेट करें:

जावास्क्रिप्ट मानक ( ECMA-262 ) के 5 वें संस्करण में एक ब्रेकिंग परिवर्तन होता है जो इस व्यवहार को समाप्त करता है। मोज़िला का अच्छा लेखन है


21
चरण 1) अपने आप को एक एहसान करो और हमेशा मूलांक को शामिल करें जैसा कि पिछले उत्तर में और साथ ही डौग की पुस्तक में वर्णित है। चरण 2) यदि आप जावास्क्रिप्ट सीखने के बारे में गंभीर हैं, तो अपने आप को डौग की पुस्तक की एक प्रति प्राप्त करें। यह अमूल्य है। मेरी फ़ेव बुक अब तक। यहाँ एक समीक्षा शुल्क है: realtech.burningbird.net/learning-javascript/basics/…
fuentesjr

8
ECMAScript 5 वें संस्करण-संगत ब्राउज़र में, जैसे कि इंटरनेट एक्सप्लोरर 9, बेस पैरामीटर डिफॉल्ट करता है 10(दशमलव) जब तक कि पार्स करने के लिए संख्या के साथ उपसर्ग नहीं किया जाता है 0x, उदाहरण के लिए 0xFF, जिस स्थिति में बेस पैरामीटर डिफॉल्ट करता है 16. उम्मीद है कि एक दिन, यह समस्या दूर की स्मृति होगी।
एंडी ई

2
कैसे बस के बारे में +'08' === 8? सच! हो सकता है कि आपको वास्तव में parseIntअपने वास्तविक कोड की आवश्यकता हो , लेकिन उपरोक्त के लिए नहीं।
कोजिरो

1
a) यह बग नहीं है, शीर्षक b को ठीक करें)Number('08')
OnTheFly

4
@portman: "5 वां संस्करण ... एक ब्रेकिंग चेंज का परिचय देता है जो इस व्यवहार को समाप्त करता है" संभवतः यह इंगित करने के लायक है कि यहां तक ​​कि 3 जी संस्करण (13 साल पहले) में, कार्यान्वयन "प्रोत्साहित किया गया था" इसे न करने के लिए: "जब मूलांक है 0या undefinedऔर स्ट्रिंग की नंबर एक के साथ शुरू होता 0है एक के बाद नहीं अंकों xया X, तो कार्यान्वयन, अपने विवेक से, संख्या या तो अष्टाधारी होने के रूप में या के रूप में किया जा रहा दशमलव व्याख्या कर सकते हैं। क्रियान्वयन दशमलव होने के रूप में इस मामले में संख्या व्याख्या करने के लिए प्रोत्साहित किया जाता है। " ( मेरा जोर)
टीजे क्राउडर

जवाबों:


328

यह एक सामान्य समाधान के साथ एक सामान्य जावास्क्रिप्ट है:

बस आधार , या 'मूलांक' निर्दिष्ट करें , जैसे:

parseInt('08',10); // 8

आप संख्या का उपयोग भी कर सकते हैं :

Number('08'); // 8

57
नंबर । शानदार।
पोर्टमैन

10
08 के आसपास नंबर की जरूरत है। इसके अलावा बस चेतावनी दी जाए, नंबर ('08 .123 ') इसके उत्पादन के रूप में 8.123 का उत्पादन करेगा। यदि आप वास्तव में पूर्णांक चाहते हैं, तो संख्या का उपयोग न करें (या केवल पूर्णांकों को सुनिश्चित करने के लिए अपने इनपुट से मिलान करें)।
जेसन एस

3
संख्या (08); मुझे फ़ायरफ़ॉक्स और IE में 8 देता है।
पाओलो बरगीनो

3
यह ईसीएमएस्क्रिप्ट मानक का हिस्सा नहीं है। मैं JSDB पर परीक्षण कर रहा हूं जो Spidermonkey 1.7 (= Firefox JS इंजन) का उपयोग करता है, और शिकायत करता है कि "08 एक कानूनी ECMA-262 अष्टक स्थिर नहीं है"
जेसन एस

5
फिर भी, उद्धरणों में '08' का उपयोग करें। 08 ECMA-262 मानक को पूरा नहीं करता है और w / o चेतावनियों और / या त्रुटियों और / या एक विशेष निर्दिष्ट व्यवहार को सफल करने की गारंटी नहीं है।
जेसन एस

43

यदि आप जानते हैं कि आपका मूल्य हस्ताक्षरित 32 बिट पूर्णांक सीमा में ~~xहोगा , तो सभी परिदृश्यों में सही काम करेंगे।

~~"08" === 8
~~"foobar" === 0
~~(1.99) === 1
~~(-1.99)  === -1

यदि आप बाइनरी नहीं देखते हैं ( ~), युक्ति को तर्क के लिए "ToInt32" रूपांतरण की आवश्यकता होती है जो एक इंट 32 तक स्पष्ट रूपांतरण करता है और NaNशून्य के लिए ज़बरदस्त मान निर्दिष्ट करता है।

हां, यह अविश्वसनीय रूप से हैकिश है लेकिन इतना सुविधाजनक है ...


2
एक बाइनरी या पर्याप्त होने पर दो ऑपरेशन क्यों?
ओलेग वी। वोल्कोव

@ अगर, तो क्यों पर्याप्त होगा?
सेबस्टियन

3
@ सेबेस्टियनगोडलेट; 0 |
ओलेग वी। वोल्कोव

@Grodriguez, और जब 0 में | 0 एक तार है?
ओलेग वी। वोल्कोव

यह पूरा प्रश्न तार को पूर्णांक में बदलने के लिए parseInt के विकल्प के बारे में है। इस प्रकार: हमेशा।
ग्रोड्रिग्ज

24

से parseInt प्रलेखन , आधार -10 निर्दिष्ट करने के लिए वैकल्पिक मूलांक तर्क का उपयोग करें:

parseInt('08', 10); //equals 8
parseInt('09', 10); //equals 9

यह मुझे पांडित्य, भ्रामक और क्रिया के रूप में प्रभावित करता है (वास्तव में, हर एक छंद में एक अतिरिक्त तर्क?) इसलिए मुझे उम्मीद है कि एक बेहतर तरीका है।


6
अगर आपको वर्बोसिटी पसंद नहीं है, तो बस अपना स्वयं का फ़ंक्शन करें जो बिलिन फ़ंक्शन को कॉल करता है और उन तर्कों में भरता है जिन्हें आप हमेशा स्थिर रखते हैं।
जेसन एस

3
Riiiiiiight, क्योंकि यह StackOverflow पर हर एक व्यक्ति की तरह नहीं है, जो आपको फ़ंक्शन parseIntB10 लिखने के लिए बाध्य करेगा। अपने स्वयं के रैपर फ़ंक्शन को लिखना इस उद्देश्य के लिए एक भयानक विचार है।
स्टीफन केंडल

2
@iftrue: मुझे लगता है कि आपने मेरी बात को याद किया। मैं व्यक्तिगत रूप से सिर्फ parseInt (someString, 10) हर जगह यह सुनिश्चित करने के लिए मन नहीं करता कि मैं बेस 10 को सुनिश्चित करूं। ओपी इस दृष्टिकोण को पसंद नहीं करता है, इसलिए मैंने एक विकल्प सुझाया, जिसका मैं व्यक्तिगत रूप से उपयोग नहीं करूंगा, लेकिन शायद यह उसे पूरा करे की जरूरत है। (यह जाहिरा तौर पर JQuery के पीछे की सोच है: अतिरिक्त जटिलता को जोड़कर इसे सुविधाजनक बनाएं। मैं JQuery का उपयोग नहीं करता हूं, लेकिन बहुत से लोग इसे उपयोगी पाते हैं।)
जेसन एस

4
वास्तव में यह रैप करने के लिए वास्तव में महत्वपूर्ण है parseIntकार्यात्मक भाव में सुविधाजनक उपयोग के लिए, की तरह mapमें ["7","4","09","5"].map(parseInt); Mapपारित करेंगे सूचकांक दूसरा तर्क है, जिसके द्वारा व्याख्या की जाएगी के रूप में सरणी में तत्व के parseIntआधार के रूप में जब तक आप इसे लपेटो।
पिल्लेक्स

11
function parseDecimal(s) { return parseInt(s, 10); }

संपादित करें: जो आप वास्तव में चाहते हैं, उसे करने के लिए अपना स्वयं का कार्य करना, अगर आप parseInt () कॉल में हर समय ", 10" जोड़ना पसंद नहीं करते हैं, तो बस एक विकल्प है। यह एक गैरमानक कार्य होने का नुकसान है: यदि आप इसे बहुत अधिक उपयोग करते हैं तो आपके लिए अधिक सुविधाजनक है, लेकिन दूसरों के लिए शायद अधिक भ्रमित है।


10

आधार निर्दिष्ट करें:

var number = parseInt(s, 10);

वाह तुम लोग तेज हो। मैंने भी क्लिपबोर्ड पर अपना जवाब दिया था। क्या आप सीधे इंटरनेट, नियो-शैली में प्लग किए जाते हैं?
पोर्टमैन

1
क्यों शैतान यह 10 आधार पर डिफ़ॉल्ट नहीं है
टॉम गुलन

2
हो सकता है क्योंकि यह मुख्य रूप से स्ट्रिंग-> नंबर परिवर्तित फ़ंक्शन के रूप में नहीं है, लेकिन एक फ़ंक्शन जो आधार बी नंबर स्ट्रिंग से नंबर पढ़ता है।
आर्टिस्टोक्स

2
इसे आधार 10 के लिए डिफ़ॉल्ट किया गया है लेकिन प्रमुख शून्य ऑक्टल को इंगित करने के लिए एक व्यापक तरीका है।
नाथन

7

क्या यह एक संस्करण के साथ parseInt को बदलने के लिए बहुत शरारती होगा जो दशमलव मान लेता है अगर इसका कोई दूसरा पैरामीटर नहीं है? (नोट - परीक्षण नहीं किया गया)

parseIntImpl = parseInt
parseInt = function(str, base){return parseIntImpl(str, base ? base : 10)}

2
हां, यह शरारती होगा - यह अन्य कोड को तोड़ देगा जो मानक व्यवहार पर निर्भर करता है।
jes5199 22

4
यह सच है, लेकिन इसमें बहुत कुछ नहीं है। यह मानक व्यवहार भी नहीं है - ऑक्टल समर्थन वैकल्पिक है।
एंड्रयू डफी

2
लेकिन आप हेक्स समर्थन को भी छोड़ रहे हैं जो वैकल्पिक नहीं है, क्या यह है? यह हमेशा सच होना चाहिए: parseInt("0xFFFFFF") === 16777215लेकिन आपके शरारती हैक के साथ यह अब काम नहीं करता हैparseInt("0xFFFFFF") === 0
टिमो


6

आप parseFloat या parseInt का उपयोग करने के बजाय, unary ऑपरेटर ( + ) का उपयोग भी कर सकते हैं ।

+"01"
// => 1

+"02"
// => 2

+"03"
// => 3

+"04"
// => 4

+"05"
// => 5

+"06"
// => 6

+"07"
// => 7

+"08"
// => 8

+"09"
// => 9

और अच्छे उपाय के लिए

+"09.09"
// => 9.09

एमडीएन लिंक

यूनीरी प्लस ऑपरेटर अपने ऑपरेंड से पहले और उसके ऑपरेंड का मूल्यांकन करता है, लेकिन अगर यह पहले से ही नहीं है, तो इसे एक नंबर में बदलने का प्रयास करता है। हालांकि एकतरफा नकार (-) भी गैर-संख्याओं को परिवर्तित कर सकता है, कुछ को एक संख्या में परिवर्तित करने का सबसे तेज़ और पसंदीदा तरीका है , क्योंकि यह संख्या पर कोई अन्य संचालन नहीं करता है।



4

यदि आपने पार्सइंट के साथ पहले से ही कोडिंग का एक गुच्छा किया है और "10," को सब कुछ नहीं जोड़ना चाहते हैं, तो आप बेस 10 को डिफ़ॉल्ट बनाने के लिए फ़ंक्शन को ओवरराइड कर सकते हैं:

window._oldParseInt = window.parseInt;
window.parseInt = function(str, rad) {
    if (! rad) {
        return _oldParseInt(str, 10);
    }
    return _oldParseInt(str, rad);
};

यह बाद के पाठक को भ्रमित कर सकता है, इसलिए एक parseInt10 () फ़ंक्शन को अधिक आत्म-व्याख्यात्मक बना सकता है। व्यक्तिगत रूप से मैं हर समय ", 10" जोड़ने की तुलना में एक साधारण फ़ंक्शन का उपयोग करना पसंद करता हूं - बस गलतियों के लिए अधिक अवसर पैदा करता है।


0

इस मुद्दे को नवीनतम क्रोम और न ही फ़ायरफ़ॉक्स (2019) में दोहराया नहीं जा सकता है।

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