স্ট্রিংটিকে জাভাস্ক্রিপ্টে সংখ্যায় রূপান্তর করার দ্রুততম কোনটি?


122

যে কোনও সংখ্যা, এটি সংখ্যা। স্ট্রিং দেখতে একটি সংখ্যার মতো লাগে, এটি সংখ্যা। অন্য সব কিছুই, এটি এনএএন যায়।

'a' => NaN
'1' => 1
1 => 1

দ্রুত যা তা একটি নির্দিষ্ট সময়ে প্রদত্ত বাস্তবায়নের অনুকূলিতকরণের উপর নির্ভর করে। উদ্দেশ্যমূলকভাবে কোনও "দ্রুততম" উপায় নেই।
আমি অলস ঘৃণা

2
'1a'স্ট্রিং দিয়ে কি করা উচিত ? সঙ্গে ' 1'এক? অন্য কথায়, কেন এটি করার সবচেয়ে সাধারণ পদ্ধতিগুলি ( Number(x)এবং parseInt(x, 10)) আপনার পক্ষে পর্যাপ্ত নয়?
রায়না 77ow

পূর্ববর্তী একটি জাসস্পিফ পরীক্ষা: jsperf.com/converting-string-to-int/3
Epascarello

বিভিন্ন পদ্ধতির সাথে এখানে একটি ভাল পারফরম্যান্স তুলনা করা হয়েছে: jsben.ch/#/NnBKM
EscapeNetscape

উত্তর:


192

আমি জানি যতদূর জানি এটি করার 4 টি উপায় রয়েছে।

Number(x);
parseInt(x, 10);
parseFloat(x);
+x;

এই দ্রুত পরীক্ষার মাধ্যমে আমি তৈরি করেছি, এটি আসলে ব্রাউজারগুলির উপর নির্ভর করে।

http://jsperf.com/best-of-string-to-number-conversion/2

Implicit 3 ব্রাউজারে সবচেয়ে দ্রুত চিহ্নিত করা হয়েছে, তবে কোডটি পড়া শক্ত করে তোলে ... তাই আপনার যা মনে হচ্ছে তা চয়ন করুন!


7
আকর্ষণীয়ভাবে গুগল অ্যানালিটিকাগুলি (যে অংশটি আপনি নিজের ওয়েবসাইটে পেস্ট করেছেন) 1*তারিখ থেকে সংখ্যা রূপান্তর করার জন্য ব্যবহার করে , যা +উপরের মতো। অর্থাৎ 1*new Date()বদলে +new Date()। সম্ভবত এটি আরও পাঠযোগ্য?
ম্যাথু উইলকক্সসন

1
আমি মনে করি 1*এটি পছন্দ হয়েছে কারণ এটি কম ত্রুটিযুক্ত। আগে একটি অযাচিত ঝোলা ভেরিয়েবল +1পার্সিং ত্রুটি নয়। এটা একটা কৌতুক ব্যবহার অনুরূপ if (MYCONSTANT == myvar)মধ্যে C
টমাস

5
@ বিটাক - বর্তমান অপ্টিমাইজেশানগুলি অন্তর্নিহিত রূপান্তরটির বিপরীতে স্থানীয় পদ্ধতিগুলির পক্ষে বলে মনে হচ্ছে। আমি ক্রোম 37.0.2062.124 এ উইন্ডোজ সার্ভার ২০০ R R2 / 7 তে নম্বর () এবং ফায়ারফক্স ৩০.০-তে পার্সিয়ান্ট () এর জন্য দ্রুততম হয়ে যাচ্ছি যার ফলে উভয়ের জন্যই সবচেয়ে ধীর। এছাড়াও, সাধারণ তুলনার জন্য আপনি পরীক্ষায় স্ট্রিং আক্ষরিক ভাসমান সহ বিবেচনা করতে পারেন। আমার অনুমান যে এটি কিছু ক্ষেত্রে ক্রম পরিবর্তন করতে পারে কারণ স্ট্রিং থেকে ফ্লোট রূপান্তরটি স্ট্রিং থেকে ইন রূপান্তরকরণের চেয়ে ধীর হয়। পরীক্ষাটি এখন যেভাবে চলছে, সংখ্যা () ব্যবহার করার পরে এটি স্ট্রিং টু ইন রূপান্তরের সাথে দূরে চলেছে।
নোলো

1
ক্রোম 61.0.3163। সংখ্যা () সকলের চেয়ে দ্রুততম।
দিমিত্রি পেটখোভ

70

এটি করার জন্য কমপক্ষে 5 টি উপায় রয়েছে:

আপনি যদি কেবল পূর্ণসংখ্যায় রূপান্তর করতে চান তবে অন্য একটি দ্রুত (এবং সংক্ষিপ্ত) উপায় হ'ল ডাবল-বিটওয়াইস নয় (অর্থাত্ দুটি টিল্ড অক্ষর ব্যবহার করে):

যেমন

~~x;

তথ্যসূত্র: http://james.padolsey.com/cool-stuff/double-bitwise-not/

একটি স্ট্রিংকে একটি সংখ্যায় রূপান্তর করার জন্য আমি এখনও অবধি জানি 5 টির মধ্যে তাদের পার্থক্য রয়েছে (আরও বিটওয়াইস অপারেটর রয়েছে যা কাজ করে তবে তারা সবাই একই ফলাফল দেয় ~~)। এই জেএসফিডাল ডিবাগ কনসোলটিতে আপনি যে বিভিন্ন ফলাফল আশা করতে পারেন তা দেখায়: http://jsfiddle.net/TrueBlueAussie/j7x0q0e3/22/

var values = ["123",
          undefined,
          "not a number",
          "123.45",
          "1234 error",
          "2147483648",
          "4999999999"
          ];

for (var i = 0; i < values.length; i++){
    var x = values[i];

    console.log(x);
    console.log(" Number(x) = " + Number(x));
    console.log(" parseInt(x, 10) = " + parseInt(x, 10));
    console.log(" parseFloat(x) = " + parseFloat(x));
    console.log(" +x = " + +x);
    console.log(" ~~x = " + ~~x);
}

ডিবাগ কনসোল:

123
  Number(x) = 123
  parseInt(x, 10) = 123
  parseFloat(x) = 123
  +x = 123
  ~~x = 123
undefined
  Number(x) = NaN
  parseInt(x, 10) = NaN
  parseFloat(x) = NaN
  +x = NaN
  ~~x = 0
null
  Number(x) = 0
  parseInt(x, 10) = NaN
  parseFloat(x) = NaN
  +x = 0
  ~~x = 0
"not a number"
  Number(x) = NaN
  parseInt(x, 10) = NaN
  parseFloat(x) = NaN
  +x = NaN
  ~~x = 0
123.45
  Number(x) = 123.45
  parseInt(x, 10) = 123
  parseFloat(x) = 123.45
  +x = 123.45
  ~~x = 123
1234 error
  Number(x) = NaN
  parseInt(x, 10) = 1234
  parseFloat(x) = 1234
  +x = NaN
  ~~x = 0
2147483648
  Number(x) = 2147483648
  parseInt(x, 10) = 2147483648
  parseFloat(x) = 2147483648
  +x = 2147483648
  ~~x = -2147483648
4999999999
  Number(x) = 4999999999
  parseInt(x, 10) = 4999999999
  parseFloat(x) = 4999999999
  +x = 4999999999
  ~~x = 705032703

~~x"আরো" ক্ষেত্রে, যেখানে অন্যদের প্রায়ই ফলে একটি সংখ্যা সংস্করণ ফলাফল undefined, কিন্তু এটা অবৈধ ইনপুট জন্য ব্যর্থ হয় (যেমন এটা ফিরে আসবে 0যদি স্ট্রিং অ সংখ্যা অক্ষর রয়েছে পর একটি বৈধ নম্বর)।

টলমলানি

দয়া করে নোট করুন: পূর্ণসংখ্যার ওভারফ্লো এবং / বা বিট কাটাটি ঘটতে পারে ~~ তবে অন্যান্য রূপান্তরগুলি নয়। যদিও এ জাতীয় বৃহত মানগুলিতে প্রবেশ করা অস্বাভাবিক, তবে আপনার এটি সম্পর্কে সচেতন হওয়া দরকার। অনেক বড় মান অন্তর্ভুক্ত করতে উদাহরণ আপডেট হয়েছে।

কিছু নিখুঁত পরীক্ষাগুলি নির্দেশ করে যে স্ট্যান্ডার্ড parseIntএবং parseFloatফাংশনগুলি আসলে দ্রুততম বিকল্পগুলি, সম্ভবত ব্রাউজারগুলি দ্বারা উচ্চতর অনুকূলিতকরণ করা হয় তবে সমস্ত অপশন পর্যাপ্ত পর্যাপ্ত হওয়ায় এটি আপনার প্রয়োজনের উপর নির্ভর করে : http://jsperf.com/best-of-string-to -number-রূপান্তর / 37

এই সমস্ত পারফ টেস্টগুলি কতটা ধীর হতে পার্সেন্ট / পার্সফ্লোয়েট শো হিসাবে কনফিগার করা যায় তার উপর নির্ভর করে।

আমার তত্ত্বটি হ'ল:

  • মিথ্যাচার
  • ডার্ন লাইন
  • পরিসংখ্যান
  • জেএসপিফারফের ফলাফল :)

3
2147483647 এর চেয়ে বড় সংখ্যার জন্য সত্যই সতর্ক হন eg যেমন: ~~4294967296রিটার্ন 0
জোসেফ গোহ

@ জোসেফগোহ: আমি যখন সুযোগ পাব তখন ফলাফলগুলি প্রসারিত করে ইনট রেঞ্জের ওভারফ্লো অন্তর্ভুক্ত করব। সাধারণত, সংখ্যাগুলি যদি বড় হয় তবে আপনার খুব বিশেষ ইন্টারফেস চলছে তাই ওভারফ্লো সম্পর্কে সচেতন হওয়া দরকার। চিয়ার্স
কোডিং হয়ে গেছে

@ জোসেফগোহ: মজার বিষয়, ক্রোমে আপনি 0 টি পাবেন না, আপনি সাইন ইন করা সর্বাধিক মানের চেয়ে নেতিবাচক সংখ্যা পেয়েছেন। তারপরে যখন আপনি স্বাক্ষরবিহীন অন্তর্নির্মিত সর্বোচ্চ মানটি ছাড়িয়ে যান তখন অতিরিক্ত বিটগুলি সহজেই ছেড়ে দেওয়া হয় drop উদাহরণস্বরূপ "4999999999" => 705032703
কোডিং হয়ে গেছে

8

+অপারেটরের সাথে স্ট্রিং উপসর্গ করুন ।

console.log(+'a') // NaN
console.log(+'1') // 1
console.log(+1) // 1

7

একটি পূর্ণসংখ্যার স্ট্রিংগুলিকে রূপান্তর করার একটি দ্রুত উপায় হ'ল কিছুটা দিক বা এটির মতো:

x | 0

যদিও এটি কীভাবে এটি প্রয়োগ করা হয় তার উপর নির্ভর করে, তত্ত্বের ভিত্তিতে এটি তুলনামূলকভাবে দ্রুত হওয়া উচিত (কমপক্ষে তত দ্রুত +x) যেহেতু এটি প্রথমে xএকটি সংখ্যায় ছাঁটাই করবে এবং তারপরে একটি খুব দক্ষ বা সম্পাদন করবে।


হ্যাঁ, তবে আমি বিশ্বাস করি যে এই কৌশলটি বৃহত পূর্ণসংখ্যার কেটে ফেলেছে, এটি বেশ খারাপ। উল্লেখ্য, আমি ম্যাথ.ফ্লোয়ার () এর পরিবর্তেও ব্যবহার করতে পারি তবে একই সমস্যা সহ with
জিন

প্রথম উত্তরের পদ্ধতির সাথে একত্রে বিভিন্ন বিটওয়াইস অপারেটরগুলির একটি জাসস্পিফ এখানে রয়েছে । আমি অর্ডারটিকে এলোমেলো করেছিলাম কারণ আমি দেখেছি যে কিছু ব্রাউজার পূর্ববর্তী পরীক্ষার অনুরূপ কোডের ভিত্তিতে পরবর্তী পরীক্ষাটি অনুকূলিত করে। শীর্ষ উত্তরদাতাদের থেকে পৃথক, আমি দেখতে পেয়েছি যে অন্তর্নিহিতটি সবচেয়ে খারাপ পদ্ধতি।
প্লুটো

4

এটি করার সহজ উপায় এখানে: var num = সংখ্যা (str); এই উদাহরণে স্ট্রিং রয়েছে এমন পরিবর্তনীয় str আপনি এটি পরীক্ষা করে দেখতে পারেন এবং এটি কীভাবে খালি কাজ করে: গুগল ক্রোম বিকাশকারী সরঞ্জামগুলি , তারপরে কনসোলে যান এবং নীচের কোডটি আটকে দিন । রূপান্তরটি কীভাবে করা হয় তা আরও ভালভাবে বুঝতে মন্তব্যগুলি পড়ুন।

// Here Im creating my variable as a string
var str = "258";


// here im printing the string variable: str
console.log ( str );


// here Im using typeof , this tells me that the variable str is the type: string
console.log ("The variable str is type: " + typeof str);


// here is where the conversion happens
// Number will take the string in the parentesis and transform it to a variable num as type: number
var num = Number(str);
console.log ("The variable num is type: " + typeof num);


3

এটি সম্ভবত তাত্পর্যপূর্ণ নয়, তবে আপনার সংখ্যাটি কমপক্ষে একটি নির্দিষ্ট মান (উদাহরণস্বরূপ 0), বা সর্বাধিক একটি নির্দিষ্ট মান নিশ্চিত করার অতিরিক্ত সুবিধা রয়েছে:

Math.max(input, 0);

আপনার যদি কোনও ন্যূনতম মান নিশ্চিত করতে হয় তবে সাধারণত আপনি তা করেন

var number = Number(input);
if (number < 0) number = 0;

Math.max(..., 0) দুটি বিবৃতি লেখার হাত থেকে বাঁচায়।


কেন ব্যবহার Math.abs(input)করবেন না ? এটি স্ট্রিংকে ধনাত্মক সংখ্যায় রূপান্তরিত করে এবং কয়েকটি অতিরিক্ত অক্ষর সংরক্ষণ করে।
অ্যারন গিলিয়ন

1
@ অ্যারোনগিলিয়ন: ম্যাথ.ম্যাক্স (-5, 0) 0 ফিরে আসবে; ম্যাথ.অ্যাবস (-5) 5 ফিরে আসবে It এটি ব্যবহারের ক্ষেত্রে নির্ভর করে যা আরও বোধ করে।
ড্যান ড্যাসকলেসকু

1
ওহ, ওফ, হ্যাঁ, আমি যে মন্তব্যটি লিখেছিলাম গভীর রাতে আমার ব্যবহারের ক্ষেত্রে বিষয়টি আলাদা ছিল।
অ্যারন গিলিয়ন

যদি inputসংখ্যায় রূপান্তর করা না যায় তবে আপনি পাবেনNaN
ডোমাস মার্চ

0

আপনি ইউনিট অফ ব্যবহারের চেষ্টা করতে পারেন , একটি পরিমাপ এবং ডেটা ধরণের রূপান্তর পাঠাগার আমরা সদ্য অফিসিয়ালি প্রকাশ করেছি! ইউনিটঅফ অত্যন্ত দ্রুত, আকারে ছোট এবং কোনও ত্রুটি বা শূন্য / অপরিজ্ঞাত ছাড়াই কোনও ডেটা ধরণের রূপান্তর করতে দক্ষ। আপনার সংজ্ঞায়িত ডিফল্ট মানগুলি বা ইউনিটঅফের ডিফল্টগুলি যখন কোনও রূপান্তর ব্যর্থ হয় তখন ফিরে আসে।

//One liner examples
UnitOf.DataType("12.5").toFloat(); //12.5 of type Float is returned. 0 would be returned if conversion failed.
UnitOf.DataType("Not A Num").toInt(10); //10 of type Int is returned as the conversion failed.

//Or as a variable
var unit = UnitOf.DataType("12.5");
unit.toInt(5); //12.5 of type Float is returned. 5 would be returned if the conversion failed.
unit.toFloat(8); // 12 of type Int is returned. 8 would be returned if the conversion failed.

0

দ্রুততম উপায়টি -0 ব্যবহার করছে:

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