জাভাস্ক্রিপ্ট সহ সংখ্যাগুলির সংখ্যা পান


124

আমার পোস্টের শিরোনাম হিসাবে, আমি জানতে চাই যে কতগুলি সংখ্যা var numberরয়েছে। উদাহরণস্বরূপ: যদি number = 15;আমার ফাংশনটি ফিরে আসে 2। বর্তমানে, এটি দেখতে এটির মতো দেখাচ্ছে:

function getlength(number) {
  return number.toString().length();
}

তবে সাফারি বলেছেন যে এটির কারণে এটি কাজ করছে না TypeError:

'2' is not a function (evaluating 'number.toString().length()')

আপনি দেখতে পাচ্ছেন, '2'আসলে সঠিক সমাধান। তবে কেন not a function?

উত্তর:


229

lengthএকটি সম্পত্তি, একটি পদ্ধতি নয়। আপনি এটি কল করতে পারবেন না, সুতরাং আপনার প্রথম বন্ধনী প্রয়োজন নেই ():

function getlength(number) {
    return number.toString().length;
}

আপডেট: মন্তব্যগুলিতে আলোচিত হিসাবে, উপরের উদাহরণটি ভাসমান সংখ্যার জন্য কাজ করবে না। এটা কাজ আমরা হয় সঙ্গে একটি নির্দিষ্ট সময়ের পরিত্রাণ পেতে পারেন তা নিশ্চিত করার String(number).replace('.', '').length, বা রেগুলার এক্সপ্রেশনের সাথে ডিজিটের গণনা: String(number).match(/\d/g).length

গতির দিক দিয়ে প্রদত্ত সংখ্যায় সংখ্যা অর্জনের দ্রুততম উপায়টি হচ্ছে এটি গাণিতিকভাবে করা। জন্য ধনাত্মক পূর্ণসংখ্যা সেখানে সঙ্গে একটি বিস্ময়কর অ্যালগরিদম হয় log10:

var length = Math.log(number) * Math.LOG10E + 1 | 0;  // for positive integers

সমস্ত ধরণের পূর্ণসংখ্যার জন্য (নেতিবাচকগুলি সহ) @ এমড্রাব্লু 247 থেকে একটি উজ্জ্বল অপ্টিমাইজড সমাধান রয়েছে তবে ব্যবহারের ক্ষেত্রে সতর্ক থাকুন Math.log10, কারণ এটি বহু লিগ্যাসি ব্রাউজারগুলি সমর্থন করে না by তাই প্রতিস্থাপন Math.log10(x)সঙ্গে Math.log(x) * Math.LOG10Eসামঞ্জস্য সমস্যার সমাধান হবে।

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

var length = (number + '').replace('.', '').length;  // for floats

3
অঙ্ক না পাওয়ার ভাল কৌশল, তবে, যদি এটি কোনও ভগ্নাংশের সংখ্যা হয়, অর্থাৎ 12.5, তবে আপনার ফাংশনটি 3 এর পরিবর্তে 4 ফিরে আসবে ...
স্বর্ণেন্দু পল

@ স্বর্ণেন্দু: সমস্যা নেই কারণ আমার কেবল পূর্ণসংখ্যা রয়েছে।
বিট

3
অন্যথায় যেমন কিছু ব্যবহার করুন number.toString().match(/\d/g).length
ভিজিওন

1
@ বাকুদান - এই উত্তরটি স্থির হয়ে গেছে বলে মনে হয়। আপনি এখনই তার সমালোচনা করে আপনার দুটি মন্তব্য মুছতে পারেন (যাতে ভবিষ্যতের লোকেরা বিভ্রান্ত না হয় এবং মনে করে যে এই উত্তরে কোডটি কার্যকর হয় না))
আর্টঅফ ওয়ারফেয়ার

1
@ 3ocene ভাল অনুমান! মানটি একই থাকে তবে দৃশ্যের পিছনে এটি পূর্ণসংখ্যায় কাস্ট করা হয়। x | 0এটির আর একটি সংক্ষিপ্ত এবং দ্রুত সংস্করণ Math.floor(x), যা সংখ্যাকে গোল করে। আপনি একই সঙ্গে অর্জন করতে পারেন ~~x। নিম্নলিখিত প্রশ্নটি পয়েন্টটিতে আরও ব্যাখ্যা প্রদান করে: stackoverflow.com/q/9049677/1249581
ভিজিওএন

66

এখানে গাণিতিক উত্তর (নেতিবাচক সংখ্যার জন্যও কাজ করে):

function numDigits(x) {
  return Math.max(Math.floor(Math.log10(Math.abs(x))), 0) + 1;
}

এবং উপরের একটি অনুকূলিত সংস্করণ (আরও কার্যকর বিটওয়াইজ অপারেশন):

function numDigits(x) {
  return (Math.log10((x ^ (x >> 31)) - (x >> 31)) | 0) + 1;
}

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

উপরের অনুমানগুলি (আপনার উদাহরণের ইনপুটের উপর ভিত্তি করে) যে আপনি সংখ্যার সংখ্যা গণনা করতে চান (সুতরাং 12345 = 5, এবং এভাবে 12345.678 = 5)। আপনি যদি মানটিতে মোট অঙ্কের সংখ্যা গণনা করতে চান (সুতরাং 12345.678 = 8), তবে উপরের দুটি ফাংশনে 'রিটার্ন' এর আগে এটি যুক্ত করুন:

x = Number(String(x).replace(/[^0-9]/g, ''));

3
দ্রষ্টব্য: ম্যাথ.লগ 10 হ'ল ইএস 6 ফাংশন বিকাশকারী.মোজিলা.আর.ইন.ইউএস
ডকস / ওয়েব

2
@ টিএক্স 3 ভাল নোট! ধন্যবাদ, Math.LOG10EES1 সাল থেকে বিদ্যমান, যার অর্থ Math.log(x) * Math.LOG10Eসামঞ্জস্যের জন্য কাজ করবে।
Mwr247

আমি মনে করি এই ফাংশনটি কাজ করে না: `` `ফাংশনটি নামডিজিট (x) {রিটার্ন (ম্যাথ.লগ 10 ((x ^ (x >> 31)) - (x >> 31)) 0) + 1; } `` `নাম ডিজিটস (1234567891) -> 10 নামডিজিট (12345678912) -> 9
লোখমাভক

@ লখমকভ কারণ এটি যে আপনি দিয়েছেন দ্বিতীয় নম্বরটি জাভাস্ক্রিপ্টের সর্বোচ্চ 32-বিট পূর্ণসংখ্যার মানকে ছাড়িয়ে গেছে, যা বিটওয়াইস অপারেটর (^, >>, |) সঠিকভাবে পরিচালনা করতে পারে না।
Mwr247

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

20

যেহেতু এটি "জাভাস্ক্রিপ্টে অঙ্কের সংখ্যা পান" এর জন্য গুগল অনুসন্ধানে উঠে আসে, তাই আমি এটি এখানে ছুঁড়ে দিতে চেয়েছিলাম যে এর জন্য একটি ছোট বিকল্প আছে যা আপনার জন্য করা অভ্যন্তরীণ কাস্টিংয়ের উপর নির্ভর করে:

var int_number = 254;
var int_length = (''+int_number).length;

var dec_number = 2.12;
var dec_length = (''+dec_number).length;

console.log(int_length, dec_length);

উৎপাদনের

3 4

4
এবং একটি দ্রুত জাসস্পিফ দেখায় যে এটি খুব দ্রুত, (যেমন 10x বা আরও বেশি): jsperf.com/number-tostring-vs-number
লেডিভিন

বিঃদ্রঃ! বিন্দুটিকে একটি সংখ্যা হিসাবেও গণনা করে। (ডিসেম্বর_সংখ্যায়)
সেবাস্তিয়ান নর

2

আপনার যদি অঙ্কগুলির প্রয়োজন হয় (বিভাজকের পরে), আপনি কেবল সংখ্যা বিভক্ত করতে পারেন এবং দৈর্ঘ্যের দ্বিতীয় অংশটি (পয়েন্টের পরে) গণনা করতে পারেন।

function countDigits(number) {
    var sp = (number + '').split('.');
    if (sp[1] !== undefined) {
        return sp[1].length;
    } else {
        return 0;
    }
}

2

var i = 1;
while( ( n /= 10 ) >= 1 ){ i++ }

23432          i = 1
 2343.2        i = 2
  234.32       i = 3
   23.432      i = 4
    2.3432     i = 5
    0.23432


1

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

function count_digits(n) {
    numDigits = 0;
    integers = Math.abs(n);

    while (integers > 0) {
        integers = (integers - integers % 10) / 10;
        numDigits++;
    }
    return numDigits;
}

সম্পাদনা: শুধুমাত্র পূর্ণসংখ্যার মানগুলির সাথে কাজ করে


1

দ্রষ্টব্য: এই ফাংশনটি দশমিক গড় বিন্দুর পরে সংখ্যাগুলি অগ্রাহ্য করবে , আপনি যদি দশমিকের সাথে গণনা করতে চান তবে মুছে ফেলুন । সরাসরি পয়েন্ট এ পরীক্ষা করে দেখুন!Math.floor()

function digitCount ( num )
{
     return Math.floor( num.toString()).length;
}

 digitCount(2343) ;

// ইএস 5 +

 const digitCount2 = num => String( Math.floor( Math.abs(num) ) ).length;

 console.log(digitCount2(3343))

মূলত এখানে কি চলছে। toString()এবং String()একই বিল্ড-ইন স্ট্রিং অঙ্ক রূপান্তর, একবার আমরা রূপান্তরিত তারপর আমরা বিল্ড-ইন ফাংশন দ্বারা স্ট্রিং এর দৈর্ঘ্য পাবেন জন্য ফাংশন length

সতর্কতা: তবে এই ফাংশনটি নেতিবাচক সংখ্যার জন্য সঠিকভাবে কাজ করবে না, আপনি যদি নেতিবাচক সংখ্যা নিয়ে খেলতে চেষ্টা করছেন তবে এই উত্তরটি পরীক্ষা করুন বা এতে সহজ সরল রেখে Math.abs()দিন;

আপনি উল্লাস!


1
`You can do it by simple loop using Math.trunc() function. if in interview interviewer ask to do it without converting it into string`
    let num = 555194154234 ;
    let len = 0 ;
    const numLen = (num) => {
     for(let i = 0; i < num ||  num == 1 ; i++){
        num = Math.trunc(num/10);
        len++ ;
     }
      return len + 1 ;
    }
    console.log(numLen(num));

0

দুটি সংখ্যা: ECMAScript 6 (ES6) সহ কোনও সংখ্যার দুটি বা ততোধিক সংখ্যার প্রয়োজন হলে সাধারণ ফাংশন:

const zeroDigit = num => num.toString().length === 1 ? `0${num}` : num;

0

সমস্যার বক্তব্য: স্ট্রিং.লেন্থ () jsfunction না ব্যবহার করে সংখ্যা / স্ট্রিং গণনা করুন । সমাধান: আমরা এটি ফরলুপের মাধ্যমে করতে পারি। যেমন

for (x=0; y>=1 ; y=y/=10){
  x++;
}

if (x <= 10) {
  this.y = this.number;                
}   

else{
  this.number = this.y;
}    

}


0

এখানে আমার সমাধান। এটি ইতিবাচক এবং নেতিবাচক সংখ্যাগুলির সাথে কাজ করে। আশাকরি এটা সাহায্য করবে

function findDigitAmount(num) {

   var positiveNumber = Math.sign(num) * num;
   var lengthNumber = positiveNumber.toString();

 return lengthNumber.length;
}


(findDigitAmount(-96456431);    // 8
(findDigitAmount(1524):         // 4

0

দৈর্ঘ্য হিসাবে হিসাবে এটি সহজ হবে

  `${NUM}`.length

যেখানে দৈর্ঘ্য পাওয়ার জন্য NUM নম্বর


0

আপনি এই কৌশল ব্যবহার করতে পারেন

(''+number).length


0

সংখ্যার দৈর্ঘ্য পেতে দয়া করে নিম্নলিখিত এক্সপ্রেশনটি ব্যবহার করুন।

length = variableName.toString().length

-7

দৈর্ঘ্যের বৈশিষ্ট্য একটি স্ট্রিংয়ের দৈর্ঘ্য (অক্ষরের সংখ্যা) প্রদান করে।

খালি স্ট্রিংয়ের দৈর্ঘ্য 0 is

var str = "Hello World!";
var n = str.length;

N এর ফলাফল হবে: 12

    var str = "";
    var n = str.length;

N এর ফলাফল হবে: 0


অ্যারের দৈর্ঘ্যের সম্পত্তি:


দৈর্ঘ্যের বৈশিষ্ট্যটি অ্যারের উপাদানগুলির সংখ্যা নির্ধারণ করে বা প্রদান করে।

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.length;

ফলাফল হবে: 4

বাক্য গঠন:

একটি অ্যারের দৈর্ঘ্য ফেরত দিন:

array.length

একটি অ্যারের দৈর্ঘ্য সেট করুন:

array.length=number

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