আমি কীভাবে জাভাস্ক্রিপ্টের পার্সি ইন্টারঅ্যাক্টাল আচরণটি ব্যবহার করব?


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 থাকে "8"বা থাকে "9"না তাই ফাংশনটি শূন্য ফিরে আসে। এটি পছন্দ করুন বা না করুন, এটি ডিজাইনের মাধ্যমে

কাজের ক্ষেত্রগুলি কি?

দ্রষ্টব্য: সম্পূর্ণতার জন্য, আমি একটি সমাধান পোস্ট করতে চলেছি, তবে এটি এমন একটি সমাধান যা আমি ঘৃণা করি, তাই দয়া করে অন্যান্য / আরও ভাল উত্তর পোস্ট করুন।


হালনাগাদ:

জাভাস্ক্রিপ্ট স্ট্যান্ডার্ড ( ECMA-262 ) এর 5 তম সংস্করণ একটি ব্রেকিং পরিবর্তন প্রবর্তন করে যা এই আচরণটি সরিয়ে দেয়। মজিলার একটি ভাল লেখার ব্যবস্থা রয়েছে


21
পদক্ষেপ 1) নিজেকে অনুগ্রহ করুন এবং সর্বদা পূর্বের উত্তরের পাশাপাশি ডগের বইতে উল্লিখিত রডিক্সটি অন্তর্ভুক্ত করুন। পদক্ষেপ 2) আপনি যদি জাভাস্ক্রিপ্ট শেখার বিষয়ে গুরুতর হন তবে ডগের বইয়ের একটি অনুলিপি নিজেই পান। এটা অমূল্য। আমার ফেভার বই এখন পর্যন্ত। : এখানে একটি পর্যালোচনা FYI এর realtech.burningbird.net/learning-javascript/basics/...
fuentesjr

8
ইন্টারনেট এক্সপ্লোরার 9 এর মতো ইসমাস্ক্রিপ্টের 5 তম সংস্করণে সামঞ্জস্যপূর্ণ ব্রাউজারগুলিতে, বেস প্যারামিটারটি 10(দশমিক) এ ডিফল্ট হয় যদি না পার্স করার সংখ্যাটি পূর্বনির্ধারিত হয় 0x, উদাহরণস্বরূপ 0xFF, এই ক্ষেত্রে বেস প্যারামিটারটি 16 এ ডিফল্ট হয় Hope আশা করি, একদিন, এই সমস্যাটি একটি দূরবর্তী স্মৃতি হবে।
অ্যান্ডি ই

2
ঠিক কীভাবে +'08' === 8? সত্য! হতে পারে আপনার সত্যিকারের কোডটির parseIntজন্য সত্যই দরকার তবে উপরেরটির জন্য নয়।
কোজিরো

1
ক) এটি কোনও বাগ নয়, শিরোনামটি ঠিক করুন খ)Number('08')
অনফ্লাই

4
@ পোর্টম্যান: "5 তম সংস্করণ ... একটি বিভাজক পরিবর্তন প্রবর্তন করে যা এই আচরণকে দূর করে" সম্ভবত এটি উল্লেখ করার মতো যে তৃতীয় সংস্করণেও (13 বছর পূর্বে) বাস্তবায়নগুলি এটি না করার জন্য "উত্সাহিত" হয়েছিল: "যখন রেডিক্স হয় 0বা হয় undefinedএবং স্ট্রিংয়ের সংখ্যাটি একটি 0অঙ্ক দ্বারা শুরু হয় যা একটি xবা Xতার পরে অনুসরণ করা হয় না , তারপরে বাস্তবায়নটি তার বিবেচনার ভিত্তিতে সংখ্যাকে অষ্টাল বা দশমিক হিসাবে ব্যাখ্যা করতে পারে Imp বাস্তবায়নের ক্ষেত্রে এই ক্ষেত্রে দশমিক হিসাবে সংখ্যার ব্যাখ্যা করতে উত্সাহ দেওয়া হয়। " ( আমার জোর)
টিজে ক্রাউডার

উত্তর:


328

এটি একটি সাধারণ সমাধান সহ একটি জাভাস্ক্রিপ্ট গোচা:

কেবল বেস বা 'রেডিক্স' নির্দিষ্ট করুন :

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

আপনি নম্বর ব্যবহার করতে পারেন :

Number('08'); // 8

57
সংখ্যা । মহিমান্বিত।
পোর্টম্যান

10
08 এর আশেপাশে সংখ্যার উদ্ধৃতিগুলি দরকার Also এছাড়াও কেবল সতর্ক করা হবে, সংখ্যা ('08 .123 ') এর আউটপুট হিসাবে 8.123 উত্পাদন করবে। আপনি যদি সত্যই কোনও পূর্ণসংখ্যার চান, তবে সংখ্যাটি ব্যবহার করবেন না (বা কেবলমাত্র পূর্ণসংখ্যাগুলি নিশ্চিত করতে আপনার ইনপুটটির সাথে মেলে)।
জেসন এস

3
সংখ্যা (08); ফায়ারফক্স এবং আইইতে আমাকে 8 দেয়।
পাওলো বার্গান্টিনো

3
এটি ECMAscript স্ট্যান্ডার্ডের অংশ নয়। আমি জেএসডিবিতে পরীক্ষা করছি যা স্পাইডারমনকি ১.7 (= ফায়ারফক্স জেএস ইঞ্জিন) ব্যবহার করে এবং অভিযোগ করে যে "08 কোনও আইনি ইসিএমএ-262 অক্টাল ধ্রুবক নয়"
জেসন এস

5
তবুও, উদ্ধৃতিগুলিতে '08' ব্যবহার করুন। 08 ECMA-262 মান পূরণ করে না এবং ডাব্লু / ও সতর্কতা এবং / অথবা ত্রুটি এবং / অথবা নির্দিষ্ট নির্দিষ্ট আচরণ সফল হওয়ার গ্যারান্টিযুক্ত নয়।
জেসন এস

43

আপনি যদি জানেন যে আপনার মানটি স্বাক্ষরিত 32 বিট পূর্ণসংখ্যার পরিসীমাতে থাকবে, তবে ~~xসমস্ত পরিস্থিতিতে সঠিক জিনিসটি করবে।

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

আপনি যদি বাইনারি না হয়ে ( ~) সন্ধান করেন তবে অনুমানটির জন্য আর্গুমেন্টের জন্য "ToInt32" রূপান্তর প্রয়োজন যা স্পষ্ট রূপান্তরটি একটি ইন্টার 32 এ পরিণত করে এবং NaNমানগুলিকে শূন্যে বাধ্য করতে নির্দিষ্ট করা হয়।

হ্যাঁ, এটি অবিশ্বাস্যরকম হ্যাকিশ তবে এটি সুবিধাজনক ...


2
কেন দুটি অপারেশন যখন একটি বাইনারি বা যথেষ্ট হবে?
ওলেগ ভি। ভলকভ

@ ওলেগ, একজন কেন যথেষ্ট হবে?
সেবাস্তিয়ান

3
@ সেবাস্তিয়ানগোডলেট, | 0
ওলেগ ভি। ভোলকভ

@ গ্রড্রিগেজ, এবং যখন 0 ইন | 0 একটি স্ট্রিং?
ওলেগ ভি। ভলকভ

এই পুরো প্রশ্নটি পূর্ণসংখ্যায় স্ট্রিং রূপান্তরকরণের জন্য পার্সেন্টের বিকল্পগুলি সম্পর্কিত। এইভাবে: সর্বদা।
গ্রোড্রিগেজ

24

পার্সিয়ান্ট ডকুমেন্টেশন থেকে বেস -10 নির্দিষ্ট করতে radচ্ছিক রেডিক্স আর্গুমেন্টটি ব্যবহার করুন:

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

এটি আমাকে পেডেন্টিক, বিভ্রান্তিকর এবং ভার্বোস হিসাবে চিহ্নিত করে (সত্যিই, প্রতিটি একক পার্সেন্টে একটি অতিরিক্ত যুক্তি?) তাই আমি আশা করছি এর থেকে আরও ভাল উপায় আছে।


6
আপনি যদি ভার্বোসিটি পছন্দ করেন না তবে কেবল নিজের ফাংশনটি তৈরি করুন যা বিল্টিন ফাংশনটিকে কল করে এবং আপনি সর্বদা স্থির রাখার যুক্তিগুলিতে পূরণ করে।
জেসন এস

3
রিয়াইইইইইট, কারণ স্ট্যাকওভারফ্লোতে প্রতিটি একক ব্যক্তির পছন্দ নয় যেমন পার্সআইএনটি বি 10 ফাংশন লেখার জন্য আপনাকে বিরক্ত করবে। আপনার নিজের র‍্যাপার ফাংশনটি লেখা এই উদ্দেশ্যে একটি ভয়ানক ধারণা।
স্টিফান কেন্ডাল

2
@ পঞ্চম: আমার ধারণা আপনি আমার বক্তব্য মিস করেছেন। আমি বেস 10 জোর করে তা নিশ্চিত করার জন্য আমি ব্যক্তিগতভাবে কেবল পার্সেইন্ট (কিছু স্ট্রিং, 10) করাতে আপত্তি করি না। ওপি এই পদ্ধতির পছন্দ করবে না বলেই আমি একটি বিকল্প প্রস্তাব করেছি, যা আমি ব্যক্তিগতভাবে ব্যবহার করব না তবে সম্ভবত এটি তার সাথে পূরণ করে চাহিদা. (এটি স্পষ্টতই JQuery এর পিছনে চিন্তাভাবনা: অতিরিক্ত জটিলতা যুক্ত করে এটিকে সুবিধাজনক করুন I আমি JQuery ব্যবহার করি না তবে অনেক লোকই এটি দরকারী বলে মনে করে))
জেসন এস

4
আসলে এটি মোড়ানো সত্যিই গুরুত্বপূর্ণ parseIntক্রিয়ামূলক এক্সপ্রেশন মধ্যে সুবিধাজনক ব্যবহারের জন্য, মত mapমধ্যে ["7","4","09","5"].map(parseInt); Mapপাস হবে সূচক দ্বিতীয় যুক্তি, যা ব্যাখ্যা করা হবে অ্যারের মধ্যে উপাদান parseIntবেস হিসাবে যদি না আপনি এটা মোড়ানো।
প্লাইঙ্কস

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

সম্পাদনা করুন: আপনার নিজের ফাংশন তৈরি করা, আপনি যা চান তা করা কেবল একটি বিকল্প যদি আপনি প্যার্সিইন্ট () কলটিতে সমস্ত সময় ", 10" যুক্ত করতে পছন্দ করেন না। এটি একটি মানহীন ফাংশন হওয়ার অসুবিধা রয়েছে: আপনি যদি এটি অনেক বেশি ব্যবহার করেন তবে আপনার পক্ষে আরও সুবিধাজনক তবে অন্যদের জন্য সম্ভবত আরও বিভ্রান্তিকর।


10

বেসটি নির্দিষ্ট করুন:

var number = parseInt(s, 10);

বাহ তোমরা সবাই দ্রুত। এমনকি ক্লিপবোর্ডে আমার উত্তর ছিল। আপনি কি সরাসরি ইন্টারনেট, নব্য-স্টাইলে প্লাগ ইন করেন?
পোর্টম্যান

1
শয়তান কেন এটি বেস 10 তে ডিফল্ট হয়নি
টম গ্লেন

2
কারণ এটি প্রাথমিকভাবে স্ট্রিং-> নম্বর রূপান্তরকারী ফাংশন হিসাবে বোঝানো হয়নি, তবে একটি ফাংশন যা একটি বেস বি নম্বর স্ট্রিং থেকে একটি সংখ্যা পাঠ করে।
শিল্পীেক্স

2
এটি বেস 10 এ ডিফল্ট হয়েছে তবে নেতৃস্থানীয় শূন্যগুলি অষ্টালকে নির্দেশ করার একটি বিস্তৃত উপায়।
নাথান

7

এটির কোনও প্যারামিটার না থাকলে দশমিক ধরে এমন সংস্করণ দিয়ে পার্সেন্টটি প্রতিস্থাপন করা কি খুব দুষ্টু হবে? (দ্রষ্টব্য - পরীক্ষিত নয়)

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

2
হ্যাঁ, এটি দুষ্টু হবে - এটি স্ট্যান্ডার্ড আচরণের উপর নির্ভর করে এমন অন্যান্য কোড ভঙ্গ করবে।
jes5199

4
এটি সত্য, তবে এর অনেক কিছুই নেই। এটি মানক আচরণও নয় - অষ্টাল সমর্থন supportচ্ছিক।
অ্যান্ড্রু ডফি

2
তবে আপনি হেক্স সমর্থনও বাদ দিচ্ছেন যা alচ্ছিক নয়, তাই না? এটি সর্বদা সত্য হওয়া উচিত: parseInt("0xFFFFFF") === 16777215তবে আপনার দুষ্টু হ্যাকের জায়গায় এটি আর কাজ করে নাparseInt("0xFFFFFF") === 0
টিমো


6

আপনি পার্সফ্লোট বা পার্সেন্ট ব্যবহারের পরিবর্তে ইউনারি অপারেটর ( + ) ব্যবহার করতে পারেন ।

+"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);
};

এটি পরবর্তী পাঠককে বিভ্রান্ত করতে পারে, সুতরাং একটি পার্সেন্ট 10 () ফাংশন করা আরও স্ব-ব্যাখ্যামূলক হতে পারে। ব্যক্তিগতভাবে আমি সর্বদা ", 10" যোগ করার চেয়ে একটি সাধারণ ফাংশন ব্যবহার করা পছন্দ করি - ভুলের জন্য কেবল আরও সুযোগ তৈরি করে।


0

এই সমস্যাটি সর্বশেষতম ক্রোমে বা ফায়ারফক্সে (2019) প্রতিলিপি করা যাবে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.