শীর্ষস্থানীয় শূন্যগুলির সাথে জাভাস্ক্রিপ্ট পার্সিয়ান্ট ()


119

জাভাস্ক্রিপ্টের পার্সিয়ান্ট ফাংশনটি পুরোপুরি কাজ করে বলে মনে হচ্ছে না।

parseInt("01") returns 1
parseInt("02") returns 2
parseInt("03") returns 3
parseInt("04") returns 4
parseInt("05") returns 5
parseInt("06") returns 6
parseInt("07") returns 7
parseInt("08") returns 0
parseInt("09") returns 0

আপনি এটি ব্যাখ্যা করতে পারবেন না। একবার চেষ্টা করে দেখো. (jsFiddle)

সম্পাদনা করুন যেহেতু এই প্রশ্নটি জিজ্ঞাসা করা হয়েছিল এবং উত্তর দেওয়া হয়েছে, তাই অষ্টকাল মূলতকে ডিফল্ট করার "বৈশিষ্ট্য" অবচয় করা হয়েছে। [ ] [ ]


28
আপনি নিশ্চয়ই মজা করছেন
জর্জি


3
বয়সের পর থেকে, 0 দিয়ে শুরু হওয়া যে কোনও সংখ্যা ওসিটিএল এবং 0 এক্স প্রতিনিধিত্ব করে হেক্সা-দশমিক represents আমি বিশ্বাস করি এটি সমস্ত ভাষার জন্য সর্বজনীন, তবে আবার আমি ভুল হতে পারি।
সেলককুমার আরুমুগাম

3
অবগতির জন্য: jsFiddle , ভাল অনলাইন চেয়ে জাভাস্ক্রিপ্ট পরীক্ষক হয় w3schools.com/jsref/tryit.asp
রকেট হাজমত

2
@JohnHartsock ইয়ে, এটা কারণ আমরা এই পোস্টে উভয় ছিল এর stackoverflow.com/questions/8761997/...
savinger

উত্তর:


180

এটি কারণ যদি কোনও সংখ্যা '0' দিয়ে শুরু হয়, তবে এটি বেস 8 (অষ্টাল) হিসাবে বিবেচিত হবে।

বেসটি দ্বিতীয় পরামিতি হিসাবে পাস করে আপনি জোর করতে পারেন।

parseInt("09", 10) // 9

ডক্স অনুসারে ২ য় প্যারামিটারটি option চ্ছিক, তবে এটি সর্বদা 10 বলে ধরে নেওয়া হয় না, কারণ আপনি উদাহরণ থেকে দেখতে পারেন।


1
হ্যাঁ, তবে এটি যদি
অষ্টাল হিসাবে

2
@ পীযূষকুশওয়াহা: অন্যদিকে। 11বেস 8 9এ বেস 10 09হয় একটি বৈধ বেস 8 সংখ্যা নয়।
রকেট হাজমত

তবে আমি পার্সেন্টের পরে 09 চাই, কোনও উপায় কি আছে
পারদীপ জৈন

39

parseIntদ্বিতীয় আর্গুমেন্টে সর্বদা একটি বেস নির্দিষ্ট করা উচিত কলগুলি :

parseInt("08", 10);

জাভাস্ক্রিপ্টের পূর্ববর্তী সংস্করণগুলি 0অষ্টাল হিসাবে শুরু হয়ে স্ট্রিংগুলি আচরণ করে (যখন কোনও ভিত্তি নির্দিষ্ট না করা হয়) এবং না হয়ও 08নয়09 বৈধ অকট্যাল নম্বর আছে।

মজিলা ডকুমেন্টেশন থেকে :

যদি রেডিক্স অপরিজ্ঞাত বা 0 হয় তবে জাভাস্ক্রিপ্ট নিম্নলিখিতগুলি ধরে নেয়:

  • যদি ইনপুট স্ট্রিংটি "0x" বা "0 এক্স" দিয়ে শুরু হয় তবে মূলটি 16 (হেক্সাডেসিমাল) হয়।
  • যদি ইনপুট স্ট্রিংটি "0" দিয়ে শুরু হয়, মূলকটি আটটি (অষ্টাল) হয়। এই বৈশিষ্ট্যটি মানহীন, এবং কিছু বাস্তবায়ন ইচ্ছাকৃতভাবে এটি সমর্থন করে না (পরিবর্তে মূল 10টি ব্যবহার করে)। এই কারণে যখন প্যার্সিইন্ট ব্যবহার করবেন তখন সর্বদা একটি রেডিক্স নির্দিষ্ট করুন
  • যদি ইনপুট স্ট্রিংটি অন্য কোনও মান দিয়ে শুরু হয় তবে মূলটি 10 ​​(দশমিক)।

প্রথম অক্ষরটি যদি একটি সংখ্যায় রূপান্তর করা যায় না, পার্সইন্ট NAN প্রদান করে।

এবং ECMAScript 3 স্ট্যান্ডার্ড থেকে:

যখন র্যাডিক্স 0 বা হয় অনির্দিষ্ট এবং STRING এর নম্বরে কোনো শুরু 0 একটি দ্বারা অনুসরণ না অঙ্ক এক্স বা এক্স , তারপর বাস্তবায়ন, তার বিবেচনা, সংখ্যা পারেন অকট্যাল হচ্ছে বা দশমিক হচ্ছে ব্যাখ্যা করা হতে পারে। বাস্তবায়নের ক্ষেত্রে দশমিক হিসাবে এই ক্ষেত্রে সংখ্যার ব্যাখ্যা করতে উত্সাহ দেওয়া হয়।

জাভাস্ক্রিপ্ট ( ECMAScript 5 ) এর সর্বশেষতম সংস্করণটি এই আচরণটি ত্যাগ করে , তবে আপনার পুরানো ব্রাউজারগুলিকে সন্তুষ্ট করার জন্য এখনও রেডিক্স নির্দিষ্ট করা উচিত ।


যেহেতু এটি অবহেলা করা হয়েছে, ভবিষ্যতে আপনি নেতৃস্থানীয় শূন্যগুলি ব্যবহার করে ভাল থাকবেন তো তাই না?
পেসারিয়ার

15

একটি রেডিক্স প্যারামিটার আছে

parseInt(value, base)

যেখানে বেসটি হল রেডিক্স।

এই ক্ষেত্রে আপনি বেস 10 (দশমিক) সংখ্যাগুলি মূল্যায়ন করছেন, সুতরাং ব্যবহার করুন

parseInt(value, 10);

4

এটি নতুন ব্রাউজারগুলিতে সম্পূর্ণ বৈধ বলে মনে হচ্ছে না। ইন্টারনেট এক্সপ্লোরার 9 এবং 10 8 'ফেরত আসবে যদি আপনি' পার্সেন্ট ("08") কার্যকর করেন তবে ইন্টারনেট এক্সপ্লোরার 8 এবং পূর্ববর্তী সংস্করণগুলি 0 (কুইর্কস মোডে IE10 এছাড়াও 0 ফিরে আসবে) ফিরে আসবে।

ক্রোমের সর্বশেষতম সংস্করণটি 8 টিও প্রত্যাবর্তন করে তাই তারা অবশ্যই ব্যাখ্যাটি পরিবর্তন করেছে।


হ্যাঁ, আচরণ বদলেছে। আমি আমার উত্তর আপডেট করব। বিকাশকারী.মোজিলা.আর.ইন-
ওয়েইন

1
হ্যাঁ, ফায়ারফক্স এবং ক্রোমের সর্বশেষ সংস্করণে এখন কোনও সমস্যা নেই।
mythicalcoder

3

এই সমস্যাটি এখন অবচয় করা হয়েছে। তবে আপনি এখনও parseIntঅন্যান্য বেসের সংখ্যাকে বেস -10 এ রূপান্তর করতে রেডিক্স ব্যবহার করতে পারেন । যেমন,

var baseTwoNumber = parseInt('0010001', 2);

রিটার্ন 17(যা বেস -10 এর 0010001)।


0

টিপ: আপনি এখনই জানেন যে কখন অষ্টাল-এ ডিফল্ট অবচয় হয়। লিগ্যাসি ব্রাউজারগুলিতে আপনি কীভাবে এটি ঠিক করবেন Here

// ES-5 15.1.2.2
if (parseInt('08') !== 8 || parseInt('0x16') !== 22) {
    parseInt = (function (origParseInt) {
        var hexRegex = /^0[xX]/;
        return function parseIntES5(str, radix) {
            str = String(str).trim();
            if (!Number(radix)) {
                radix = hexRegex.test(str) ? 16 : 10;
            }
            return origParseInt(str, radix);
        };
    }(parseInt));
}

পিএস: আপনি যদি শীর্ষস্থানীয় শূন্যের (স্ট্রিংয়ের পরিবর্তে) সাথে কেবল একটি ধ্রুবক সংখ্যা ব্যবহার করেন তবে এটি বর্তমান ব্রাউজারগুলিতে এখনও বেস 8 হিসাবে বিবেচিত হবে।
আগামেমনস

0

সমস্যাটি এখন বেশিরভাগ ব্রাউজারে পরিবর্তিত হয়েছে বলে মনে হচ্ছে।

ফায়ারফক্স ৫১.০.১ (-৪-বিট)

parseInt("09")   // 9

ক্রোম 55.0.2883.95 (-৪-বিট)

parseInt("09")   // 9

সাফারি 10.0 (12602.1.50.0.10)

parseInt("09")   // 9

=====

প্রস্তাবিত অনুশীলন

এটি বলার পরে, কেবল নিরাপদ দিকে থাকতে এবং সমস্যাগুলি এড়াতে, গৃহীত উত্তরের পরামর্শ অনুযায়ী বেস / রেডিক্স প্যারামিটারটি ব্যবহার করুন ।

parseInt("09", 10)    // 9

অতিরিক্ত পরীক্ষা

যুক্তিটি যদি স্ট্রিং না হয় তবে আমি কেবল এটিও পরীক্ষা করতে চেয়েছিলাম। ক্রোম এবং সাফারি সঠিক ফলাফল দেয়। ফায়ারফক্সও সঠিক ফল দেয় তবে একটি সতর্কতা দিয়ে।

parseInt(09)     // 9. (Warning: SyntaxError: 09 is not a legal ECMA-262 octal constant)

0 দিয়ে মান শুরু হয় এবং একটি সংখ্যা হয়, তাহলে parseInt এখনও বেস 8. চেষ্টা parseInt (020) ব্যবহার করা হবে
sirrocco

হ্যাঁ. এমনকি আমি প্রস্তাবিত উত্তরের দিকে ইঙ্গিতও করেছি। এবং আমি এড়াতে ভাল অনুশীলন এবং খারাপ বৈশিষ্ট্য জানি। তাই আমি আমার উত্তরে প্রস্তাবিত অনুশীলনও দিয়েছি।
পৌরাণিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.