जावास्क्रिप्ट के साथ अंकों की संख्या प्राप्त करें


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

सभी प्रकार के पूर्णांकों (नकारात्मक सहित) के लिए @ Mwr247 से एक शानदार अनुकूलित समाधान है , लेकिन उपयोग करने में सावधानी बरतें Math.log10, क्योंकि यह कई विरासत ब्राउज़रों द्वारा समर्थित नहीं है। तो के Math.log10(x)साथ बदलने Math.log(x) * Math.LOG10Eसे संगतता समस्या हल हो जाएगी।

फ़्लोटिंग पॉइंट गणित के अच्छी तरह से ज्ञात व्यवहार के कारण दशमलव संख्याओं के लिए तेजी से गणितीय समाधान आसान नहीं होगा , इसलिए कास्ट-टू-स्ट्रिंग दृष्टिकोण अधिक आसान और मूर्ख प्रमाण होगा। जैसा कि @streetlogics द्वारा उल्लेख किया गया है तेजी से कास्टिंग स्ट्रिंग संख्या के लिए सरल संख्या के साथ किया जा सकता है, जिसके लिए प्रतिस्थापित समाधान का नेतृत्व किया जा सकता है:

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

3
अच्छी तकनीक से कोई अंक नहीं मिलता है, लेकिन, क्या होगा अगर यह एक अंश संख्या है, यानी, 12.5, तो आपका फ़ंक्शन 3 के बजाय 4 वापस आ जाएगा ...
स्वर्णेंदु पॉल

@Swarnendu: यह कोई समस्या नहीं है क्योंकि मेरे पास पूर्णांक हैं।
bit4fox

3
अन्यथा जैसे कुछ का उपयोग करें number.toString().match(/\d/g).length
VisioN

1
@ बाकुदन - यह उत्तर निश्चित प्रतीत होता है। आप अपनी दो टिप्पणियाँ अब इसे हटा सकते हैं (ताकि भविष्य के लोग भ्रमित न हों और सोचें कि इस उत्तर में कोड काम नहीं करता है।)
ArtOfWarfare

1
@ 3ocene अच्छा अनुमान! मान समान रहता है, लेकिन दृश्य के पीछे इसे पूर्णांक में डाला जाता है। x | 0का एक और छोटा और तेज़ संस्करण है Math.floor(x), जो संख्या को गोल करता है। आप उसी के साथ हासिल कर सकते हैं ~~x। निम्नलिखित प्रश्न बिंदु पर अधिक स्पष्टीकरण प्रदान करता है: stackoverflow.com/q/9049677/1249581
VisioN

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 जोड़ते हैं।

उपरोक्त अनुमान (आपके उदाहरण इनपुट के आधार पर) जो आप पूर्णांक में अंकों की संख्या की गणना करना चाहते हैं (इसलिए 12345 = 5, और इस प्रकार 12345.678 = 5 भी)। यदि आप मान में कुल अंकों की संख्या गिनना चाहते हैं (तो 12345.678 = 8), तो ऊपर दिए गए किसी भी कार्य में 'वापसी' से पहले इसे जोड़ें:

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

3
नोट: Math.log10 ES6 फ़ंक्शन डेवलपर.
mozilla.org/en-US/docs/Web/JavaScript/Reference/…

2
@ Tx3 अच्छा नोट! शुक्र है, Math.LOG10EES1 के बाद से अस्तित्व में है, जिसका मतलब है कि Math.log(x) * Math.LOG10Eसंगतता के लिए काम करेगा।
Mwr247

मुझे लगता है कि यह फ़ंक्शन काम नहीं करता है: `` `फ़ंक्शन संख्या (x) {वापसी (Math.log10 ((x ^ 31))) - (x >> 31)) | 0) + 1 | } `` `संख्या (1234567891) -> 10 अंक (12345678912) -> 9
lokhmakov

@lokhmakov ऐसा इसलिए है क्योंकि आपने जो दूसरा नंबर दिया है, वह जावास्क्रिप्ट के अधिकतम 32-बिट पूर्णांक मान से अधिक है, जिसे बिटवाइज़ ऑपरेटर (^, >>;) सही ढंग से संभाल नहीं सकते हैं।
Mwr247

1
सच। एक को उम्मीद करनी चाहिए कि जेएस केवल अधिकतम सुरक्षित इंट के साथ काम करता है, और यह संख्या लगभग किसी की भी आवश्यकता के मुकाबले बहुत बड़ी है। मैं बहुत बड़ी संख्या के साथ एक गेम विकसित कर रहा हूं और उस सीमा के कारण अनुकूलित कोड का उपयोग नहीं कर सका, और लगा कि मैं किसी अन्य नाव को लाइन से नीचे टूटी हुई कोड से समान नाव में किसी और को बचाने के लिए टिप्पणी करूंगा। वैसे शानदार जवाब।
जस्टिन

20

चूंकि यह "जावास्क्रिप्ट प्राप्त अंकों की संख्या" के लिए एक Google खोज पर आया था, मैं इसे वहां फेंकना चाहता था कि इसके लिए एक छोटा विकल्प है जो आपके लिए किए जाने वाले आंतरिक कास्टिंग पर निर्भर करता है:

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
और एक त्वरित jsperf दर्शाता है कि यह MUCH तेज़ है, भी (10x या अधिक के रूप में): jsperf.com/number-tostring-vs-number
लेडिविन

ध्यान दें! डॉट को संख्या के रूप में भी गिना जाता है। (dec_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

मैं अभी भी जावास्क्रिप्ट सीखने की तरह हूँ, लेकिन मैं थोड़ी देर पहले सी में इस फ़ंक्शन के साथ आया था, जो एक स्ट्रिंग के बजाय गणित और थोड़ी देर के लूप का उपयोग करता है इसलिए मैंने इसे जावास्क्रिप्ट के लिए फिर से लिखा। शायद यह किसी भी तरह से पुनरावर्ती किया जा सकता है, लेकिन मैंने अभी भी वास्तव में इस अवधारणा को नहीं समझा है :( यह सबसे अच्छा मैं साथ आ सकता है। मुझे यकीन नहीं है कि यह कितनी बड़ी संख्या के साथ काम करता है, यह तब काम किया जब मैंने एक सौ में डाल दिया। अंक।

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

दो अंक: ईसीएमएस्क्रिप्ट 6 (ईएस 6) के साथ किसी संख्या के दो या अधिक अंकों की आवश्यकता होने पर सरल कार्य:

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

0

समस्या कथन: संख्या की संख्या / स्ट्रिंग का उपयोग न करें string.length () jsfunction। समाधान: हम इसे Forloop के माध्यम से कर सकते हैं। जैसे

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 है।

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
यह सवाल का जवाब नहीं देता है
स्टीव टेलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.