কোনও সংখ্যাটিকে জাভাস্ক্রিপ্টে স্ট্রিংয়ে রূপান্তর করার সর্বোত্তম উপায় কী?


516

কোনও সংখ্যাকে একটি স্ট্রিংয়ে রূপান্তর করার "সেরা" উপায় কী (গতির সুবিধা, স্বচ্ছতার সুবিধা, স্মৃতিশক্তির সুবিধা ইত্যাদির ক্ষেত্রে)?

কিছু উদাহরণ:

  1. String(n)

  2. n.toString()

  3. ""+n

  4. n+""

উত্তর:


516

এটার মত:

var foo = 45;
var bar = '' + foo;

প্রকৃতপক্ষে, যদিও আমি সাধারণত এটি সাধারণ সুবিধার জন্য এটি করি, 1000 টিরও বেশি পুনরাবৃত্তি এটি কাঁচা গতির জন্য প্রদর্শিত হয় যার জন্য একটি সুবিধা রয়েছে.toString()

এখানে পারফরম্যান্স পরীক্ষা দেখুন (আমার দ্বারা নয়, তবে আমি নিজের লেখা লিখতে গিয়েছি): http://jsben.ch/#/ghQYR

উপরের জেএসপিআইপি পরীক্ষার উপর ভিত্তি করে দ্রুততম: str = num.toString();

এটি লক্ষ করা উচিত যে গতির পার্থক্য অত্যধিক তাত্পর্যপূর্ণ নয় যখন আপনি বিবেচনা করেন যে এটি 0.1 সেকেন্ডে 1 মিলিয়ন বার কোনও উপায়ে রূপান্তর করতে পারে ।

আপডেট: গতিটি ব্রাউজারের মাধ্যমে খুব বেশি আলাদা বলে মনে হচ্ছে। Chrome num + ''এ এই পরীক্ষার উপর ভিত্তি করে ক্রোমটিকে দ্রুততম বলে মনে হচ্ছে http://jsben.ch/#/ghQYR

আপডেট 2: আবার আমার উপরের পরীক্ষার উপর ভিত্তি করে এটি লক্ষ্য করা উচিত যে ফায়ারফক্স 20.0.1 নমুনার .toString()চেয়ে প্রায় 100 গুণ ধীর করে দেয় '' + num


58
এমন কেস রয়েছে যেখানে রূপান্তরটি কোনও পছন্দসই উত্তর না ফেরত দিতে পারে: '' + 123e-50রিটার্ন "1.23e-48"
hongymagic

21
@ হঙ্গিমাজিক: উত্তরটি আসলে একমাত্র অনুমেয়: সংখ্যাটি এটি কীভাবে প্রবেশ করেছে তা যত্ন করে না এবং জানে না এবং প্রমিত মুদ্রিত উপস্থাপনাটি বিন্দুর আগে ঠিক এক অঙ্কের সাথে রয়েছে।
সোভান্তে

4
আমি jsben.ch/ghQYR এ পরীক্ষা চালিয়েছি , প্রতিবার এটি আমাকে আলাদা ফলাফল দেখায়!
মেরিয়াম সাeদী

2
আমি এই উত্তরটি পছন্দ করি কারণ একটি null fooত্রুটি ফেলে না।
ttugates

2
@MaryamSaeidi: ব্যবহার drublic এর jsperf.com পরীক্ষা উপরে আরও বেশি সঙ্গতিপূর্ণ বলে মনে হয়।
গিরালদী

364

আমার মতে n.toString()এটির স্পষ্টতার জন্য পুরষ্কারটি লাগে এবং আমার মনে হয় না এটি কোনও অতিরিক্ত ওভারহেড বহন করে।


সাম্প্রতিক ব্রাউজার সংস্করণে এটি তুচ্ছ হলেও এটি কিছু ওভারহেড বহন করে। ফায়ারফক্স কোয়ান্টামে কমপক্ষে
পিটারচৌলা

11
এটি অনিরাপদ। n নাল বা অপরিজ্ঞাত হতে পারে।
ডেভিড.পিএফএফএক্স

20
@ ডেভিড.পিএফএফএক্স প্রশ্নটি জিজ্ঞাসা করে যে কীভাবে সংখ্যাসূচক মানগুলিকে স্ট্রিংয়ে রূপান্তর করতে হয়। সংখ্যাসূচক মানগুলির উদাহরণ প্রদান (যেমন null, undefined) এই উত্তরটির সাথে কঠোরভাবে কাজ করে না এটিকে "অনিরাপদ" করে তোলে।
মাইকেল মার্টিন-স্মাকার 23

5
@ মাইকেলমার্টিন-স্মুকার: আপনি প্রচুর জেএস লিখলে বুঝতে পারেন যে জিনিসগুলি খুব কম কাটা এবং শুকানো হয়। প্রশ্নটি উন্মুক্ত ছিল এবং আইএমওর একটি উত্তরের উত্তর অবশ্যই অন্তত এমন একটি স্ট্রিংয়ের বিষয়টি স্বীকার করবে যা আসলে নাল বা অপরিজ্ঞাত। YMMV।
ডেভিড.পিএফএফএক্স

@ ডেভিড.পিএফএফএক্স আমি প্রচুর জেএস লিখেছি এবং শেষ বারের মতো মনে নেই যেখানে আমার একটি স্ট্রিং হিসাবে একটি সংখ্যার প্রয়োজন ছিল এবং স্ট্রিংয়ের মতো একটি সংখ্যাও যথেষ্ট ছিল। এটা সঠিক উত্তর. পরিচালনার কোনও উত্তর নেই nullবা undefinedএটি প্রয়োগের নির্দিষ্ট হিসাবে যেমনটি আমি কল্পনা করি তবে (n || defaultNumber).toString() বেশিরভাগ লোকেরা এমন পরিস্থিতিতে কী চায় তা আমি দৃree়ভাবে অসম্মতি জানাই আমাদের এটি সমস্ত প্রশ্নের মধ্যে কাজ করা উচিত। এটি সংখ্যাকে স্ট্রিংয়ে রূপান্তর করা, ভাল আর্কিটেকচার এবং অন্যান্য ধরণের রূপান্তরগুলির যেখানে পৃথক পাঠ প্রয়োজন needed
জর্জ রিথ

73

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

সুতরাং, উপরোক্ত কারণে আমি সাথে যাব: n.toString()বা String(n)String(n)সম্ভবত এটি একটি ভাল পছন্দ কারণ nনাল বা অপরিজ্ঞাত থাকলে এটি ব্যর্থ হবে না ।


12
প্রশ্নটি সংখ্যার রূপান্তরকারী সম্পর্কে ছিল, সংখ্যার রূপান্তরকারী সম্পর্কে নয়, বা null, বা undefined। যদি nহয় nullবা undefinedআমার প্রোগ্রামের কোনও বাগের কারণে হয়, তবে আমি আমার প্রোগ্রামটি এই অবস্থায় ব্যর্থ হওয়ার জন্য, আমাকে ত্রুটিটি সন্ধানের এবং ফিক্স করার আরও ভাল সুযোগ দেওয়ার জন্য পছন্দ করতাম। প্রোগ্রাম ক্র্যাশগুলি প্রোগ্রামারকে উপহার হিসাবে, বাগগুলি খুঁজে পেতে সহায়তা করে :-)। বিকল্পটি হ'ল এমন সফ্টওয়্যার সরবরাহ করা যা বাগের উপর দিয়ে সাবধানতার সাথে পর্যালোচনা করে ডিজাইন হিসাবে কাজ করে না। সুতরাং, আমি String(n)কোনও ত্রুটিটি মাস্ক করার জন্য অনুরাগী নই ।
ম্যাট ওয়ালিস

1
String(n)একটি কার্যকরী শৈলীতে যেমন উদাহরণস্বরূপ আন্ডারস্কোর এর সমন্বয় সঙ্গে ব্যবহার করা ভাল _.compose(funcThatNeedsAStringParam, String)
রিক মার্টিনস

2
স্ট্রিং (নাল) প্রোগ্রামটি ক্র্যাশ করবে না, তবে এটি আক্ষরিক স্ট্রিং "নাল" ফিরিয়ে দেবে, যা সম্ভবত আপনি চান না। যদি ডেটা বৈধভাবে নালার হতে পারে তবে আপনার এটি স্পষ্টভাবে পরিচালনা করতে হবে।
পিটার স্মার্ট

1
@ ম্যাটওয়ালিস আমি মনে করি এটি বিকাশের সিদ্ধান্ত হওয়া উচিত, উত্তরদাতাদের নয়, আপনি কি ভাবেন না?
forresthopkinsa

30

... জাভাস্ক্রিপ্টের পার্সার একটি ভাসমান পয়েন্ট আক্ষরিক হিসাবে একটি সংখ্যায় বিন্দু চিহ্ন চিহ্নিত করার চেষ্টা করে।

2..toString(); // the second point is correctly recognized
2 .toString(); // note the space left to the dot
(2).toString(); // 2 is evaluated first

সূত্র


17

জিহ্বা-ইন-গাল স্পষ্টত:

var harshNum = 108;
"".split.call(harshNum,"").join("");

অথবা ES6 এ আপনি কেবল টেম্পলেট স্ট্রিং ব্যবহার করতে পারেন :

var harshNum = 108;
`${harshNum}`;

আমি যদি ES6 টেমপ্লেটগুলি সহ বেঞ্চমার্কগুলি চালিত করি তবে এটি কখনও কখনও এমনকি '' + numberপদ্ধতির চেয়েও দ্রুত প্রমাণিত হয় । এটি বলেছে, এই মানদণ্ডগুলির ফলাফলগুলি একাধিকবার সম্পাদন করার সময় অনেকগুলি পরিবর্তিত হয় তাই এগুলি খুব গুরুতর নেওয়া উচিত কিনা তা নিশ্চিত নয়।
নিকো ভ্যান বেল

15

অন্যান্য উত্তরগুলি ইতিমধ্যে অন্যান্য বিকল্পগুলি কভার করেছে, তবে আমি এটিকে পছন্দ করি:

s = `${n}`

সংক্ষিপ্ত, সংক্ষিপ্ত, ইতিমধ্যে অন্যান্য অনেক জায়গায় ব্যবহার করা হয়েছে (যদি আপনি একটি আধুনিক কাঠামো / ইএস সংস্করণ ব্যবহার করে থাকেন) তবে এটি কোনও নিরাপদ বাজি যে কোনও প্রোগ্রামার এটি বুঝতে পারে।

এটি (সাধারণত) খুব বেশি গুরুত্ব দেয় না তবে এটি অন্যান্য পদ্ধতির তুলনায় দ্রুততম হিসাবেও মনে হয় ।


এটি n নিরাপদে সংখ্যা না থাকলে এটিও নিরাপদ।
ডেভিড.পিএফএফএক্স

তবে কি তাই n.toString(), তাই না?
amn

1
@ যদি এটি nহয় তবে undefinedএটি ব্যবহার করে একটি সিনট্যাক্স ত্রুটি ছুঁড়ে ফেলবে.toString()
জি মক

এটি কি String(n)সব ক্ষেত্রে একই ফলাফল দেয় না ? পার্থক্যটি হ'ল এটি কম পরিষ্কার।
বেনেট ম্যাকএলউই


12

যে কোনও ভেরিয়েবলকে স্ট্রিনে রূপান্তর করার সহজ উপায় হ'ল সেই ভেরিয়েবলটিতে একটি খালি স্ট্রিং যুক্ত করা।

5.41 + ''    // Result: the string '5.41'
Math.PI + '' // Result: the string '3.141592653589793'

2
নোট করুন যে এটি (5.41 + '').substring()
পেরেনগুলির

কেন এটি লক্ষ করা প্রয়োজন?
অ্যাড্রিয়ান বার্থোলোমিউ

6

আমি নিম্নলিখিত কেসগুলির জন্য একটি কেস কেস তৈরি করতে https://jsperf.com ব্যবহার করেছি :

number + ''
`${number}`
String(number)
number.toString()

https://jsperf.com/number-string-conversion-speed-comparison

২৪ শে জুলাই, 2018 পর্যন্ত ফলাফলগুলি বলেছে যে number + ''ফায়ারফক্সে ক্রোমের মধ্যে সবচেয়ে দ্রুত যা টেম্পলেট স্ট্রিং লিটারেলের সাথে সম্পর্কযুক্ত।

উভয়ই String(number)এবং number.toString()দ্রুততম বিকল্পের চেয়ে প্রায় 95% ধীর।

কর্মক্ষমতা পরীক্ষা, উপরে বর্ণনা


6

আপনার যদি ফলাফলকে নির্দিষ্ট সংখ্যক দশমিক স্থানে ফর্ম্যাট করতে হয় , যেমন মুদ্রা উপস্থাপনের জন্য, আপনার toFixed()পদ্ধতির মতো কিছু দরকার something

number.toFixed( [digits] )

digits দশমিক স্থানের পরে প্রদর্শিত সংখ্যাগুলির সংখ্যা।


2
আপনি যদি না জানেন তবে এটি অসুরক্ষিত ।
ডেভিড.পিএফএফএক্স

2

তারা পড়তে সহজ হওয়ায় আমি প্রথম দুটি পছন্দ করি। আমি ব্যবহার করার ঝোঁক String(n)কিন্তু এটি অন্য যে কোনও কিছুর চেয়ে স্টাইলের বিষয়।

আপনার মত লাইন না থাকলে তা হয়

var n = 5;
console.log ("the number is: " + n);

যা খুব স্ব-বর্ণনামূলক


2

আমি মনে করি এটি পরিস্থিতিটির উপর নির্ভর করে তবে যেভাবেই আপনি .toString()পদ্ধতিটি ব্যবহার করতে পারবেন এটি বুঝতে খুব পরিষ্কার।


2

.toString () হ'ল বিল্ট-ইন টাইপকাস্টিং ফাংশন, আমি সেই বিশদগুলির জন্য কোনও বিশেষজ্ঞ নই তবে যখনই আমরা বিল্ট-ইন টাইপ কাস্টিং শ্লোকের স্পষ্ট পদ্ধতিগুলির সাথে তুলনা করি, অন্তর্নির্মিত কাজের ক্ষেত্রগুলি সর্বদা পছন্দ করে।


1

আমার যদি সমস্ত কিছু বিবেচনায় নিতে হয় তবে আমি নিম্নলিখিতটি প্রস্তাব করব

var myint = 1;
var mystring = myint + '';
/*or int to string*/
myint = myint + ''

আইএমএইচও, এটি স্ট্রিংয়ে রূপান্তরিত করার দ্রুততম উপায়। আমি ভুল হলে আমাকে সংশোধন করুন।


1

প্রায় সমস্ত সম্ভাব্য বিদ্যমান এবং ভবিষ্যতের ক্ষেত্রে একমাত্র বৈধ সমাধান (ইনপুটটি সংখ্যা, নাল, অপরিজ্ঞাত, প্রতীক, অন্য কিছু) String(x)। "এখানে আমি স্পষ্টভাবে সংখ্যাকে স্ট্রিংয়ে রূপান্তর করি এবং এখানে অবশ্যই বুলিয়ানকে স্ট্রিংয়ে পরিণত করি" এর মতো সহজ অপারেশনের জন্য 3 টি উপায় ব্যবহার করবেন না।

ব্যাখ্যা:

String(x)নালগুলি, অপরিজ্ঞাত, চিহ্নগুলি, [যেকোনো কিছু] পরিচালনা করে এবং .toString()বস্তুর জন্য কল করে।

'' + x.valueOf()এক্স এ কল করুন (সংখ্যায় কাস্টিং), প্রতীকগুলিতে ছোঁড়া, বাস্তবায়ন নির্ভর ফলাফল সরবরাহ করতে পারে।

x.toString() নাল এবং অপরিবর্তিত উপর নিক্ষেপ

দ্রষ্টব্য: String(x)প্রোটোটাইপ-কম বস্তুর মতো এখনও ব্যর্থ হবে Object.create(null)

আপনি যদি 'হ্যালো, অপরিজ্ঞাতকৃত' মতো স্ট্রিং পছন্দ করেন না বা প্রোটোটাইপ-কম অবজেক্টগুলিকে সমর্থন করতে চান তবে নিম্নলিখিত ধরণের রূপান্তর ফাংশনটি ব্যবহার করুন:

/**
 * Safely casts any value to string. Null and undefined are converted to ''.
 * @param  {*} value
 * @return {string}
 */
function string (str) {
  return value == null ? '' : (typeof value === 'object' && !value.toString ? '[object]' : String(value));
}

1

সংখ্যাটি আক্ষরিক সহ, কোনও সম্পত্তি অ্যাক্সেসের জন্য বিন্দুটি অবশ্যই দশমিক বিন্দুর চেয়ে আলাদা হওয়া উচিত। আপনি যদি আক্ষরিক 123 সংখ্যায় স্ট্রিং () তে প্রার্থনা করতে চান তবে এটি আপনাকে নিম্নলিখিত বিকল্পগুলির সাথে ছেড়ে দেয়:

123..toString()
123 .toString() // space before the dot 123.0.toString()
(123).toString()

1

নীচে জেএসে একটি পূর্ণসংখ্যাকে স্ট্রিংয়ে রূপান্তর করার পদ্ধতিগুলি রয়েছে

কর্মক্ষমতা হ্রাস ক্রমে পদ্ধতিগুলি সাজানো হয়।

(পারফরম্যান্স পরীক্ষার ফলাফলগুলি তার উত্তরে @ ডার্কব্লেজারের দেওয়া হয়েছে)

var num = 1

পদ্ধতি 1:

num = `$ {num}`

পদ্ধতি 2:

নাম = নাম + ''

পদ্ধতি 3:

সংখ্যা = স্ট্রিং (সংখ্যা)

পদ্ধতি 4:

সংখ্যা = num.to স্ট্রিং ()

দ্রষ্টব্য: আপনি সরাসরি একটি নম্বর থেকে টর্স্টিং () কল করতে পারবেন না

উদাহরণস্বরূপ: ২.to স্ট্রিং () আনচাক্ট সিনট্যাক্স এরর ফেলে দেবে : অবৈধ বা অপ্রত্যাশিত টোকেন


0

আপনি যদি কৌতূহল বোধ করেন তবে সর্বাধিক পারফরম্যান্ট কে এইটি পরীক্ষা করে দেখুন যেখানে আমি সমস্ত ভিন্ন সংখ্যা -> স্ট্রিং রূপান্তরগুলির তুলনা করি।

দেখে মনে হচ্ছে 2+''বা 2+""দ্রুততম।

https://jsperf.com/int-2-string


0

আমরা স্ট্রিং কনস্ট্রাক্টরও ব্যবহার করতে পারি । এই বেঞ্চমার্ক অনুসারে " + numজনপ্রিয় ব্রাউজার গুগল ক্রোমের চেয়ে ধীর গতির হলেও এটি ফায়ারফক্স ৫৮ এ একটি নম্বরকে স্ট্রিংয়ে রূপান্তর করার দ্রুততম উপায় ।



0

আপনি Numberঅবজেক্টকে কল করতে পারেন এবং তারপরে কল করতে পারেন toString()

Number.call(null, n).toString()

আপনি এই ট্রিকটি অন্য জাভাস্ক্রিপ্ট নেটিভ অবজেক্টের জন্য ব্যবহার করতে পারেন।


0

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

এখানে লিঙ্কটি পড়ুন


0

আমার যখন সময় হবে তখন আমি আরও তথ্য দিয়ে এটি পুনরায় সম্পাদনা করতে যাচ্ছি, এই মুহূর্তে এটি ঠিক আছে ...

নোডেজ v8.11.2: 2018/06/06 এ পরীক্ষা করুন

let i=0;
    console.time("test1")
    for(;i<10000000;i=i+1){
    	const string = "" + 1234;
    }
    console.timeEnd("test1")
    
    i=0;
    console.time("test1.1")
    for(;i<10000000;i=i+1){
    	const string = '' + 1234;
    }
    console.timeEnd("test1.1")
    
    i=0;
    console.time("test1.2")
    for(;i<10000000;i=i+1){
    	const string = `` + 1234;
    }
    console.timeEnd("test1.2")
    
    i=0;
    console.time("test1.3")
    for(;i<10000000;i=i+1){
    	const string = 1234 +  '';
    }
    console.timeEnd("test1.3")
    
    
    i=0;
    console.time("test2")
    for(;i<10000000;i=i+1){
    	const string = (1234).toString();
    }
    console.timeEnd("test2")
    
    
    i=0;
    console.time("test3")
    for(;i<10000000;i=i+1){
    	const string = String(1234);
    }
    console.timeEnd("test3")
    
    
    i=0;
    console.time("test4")
    for(;i<10000000;i=i+1){
    	const string = `${1234}`;
    }
    console.timeEnd("test4")
    
    i=0;
    console.time("test5")
    for(;i<10000000;i=i+1){
    	const string = 1234..toString();
    }
    console.timeEnd("test5")
    
    i=0;
    console.time("test6")
    for(;i<10000000;i=i+1){
    	const string = 1234 .toString();
    }
    console.timeEnd("test6")

আউটপুট

test1: 72.268ms
test1.1: 61.086ms
test1.2: 66.854ms
test1.3: 63.698ms
test2: 207.912ms
test3: 81.987ms
test4: 59.752ms
test5: 213.136ms
test6: 204.869ms

হ্যাঁ - টেস্ট 4 যা আমি নিয়মিত ব্যবহার করি !!
অ্যাড্রিয়ান বার্থোলোমিউ

0

নোড.জেএস ব্যবহার করার সময় এটি একই রকম ফলাফল বলে মনে হচ্ছে আমি এই স্ক্রিপ্টটি চালিয়েছি:

let bar;
let foo = ["45","foo"];

console.time('string concat testing');
for (let i = 0; i < 10000000; i++) {
    bar = "" + foo;
}
console.timeEnd('string concat testing');


console.time("string obj testing");
for (let i = 0; i < 10000000; i++) {
    bar = String(foo);
}
console.timeEnd("string obj testing");

console.time("string both");
for (let i = 0; i < 10000000; i++) {
    bar = "" + foo + "";
}
console.timeEnd("string both");

এবং নিম্নলিখিত ফলাফল পেয়েছেন:

 node testing.js
string concat testing: 2802.542ms
string obj testing: 3374.530ms
string both: 2660.023ms

প্রতিবার একই সময় আমি এটি চালানো।

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