मैं किसी संख्या की लंबाई कैसे जान सकता हूं?


161

मैं जावास्क्रिप्ट या jQuery में एक संख्या की लंबाई प्राप्त करना चाहता हूं?

मैंने value.lengthबिना किसी सफलता के प्रयास किया है , क्या मुझे इसे पहले एक स्ट्रिंग में बदलने की आवश्यकता है?


3
हां, इसे स्ट्रिंग में परिवर्तित करें। किसी संख्या की "लंबाई" की अवधारणा केवल कुछ संख्या प्रतिनिधित्व योजना के संदर्भ में सार्थक है।
पॉंच

हाँ, आपको पहले स्ट्रिंग, आईई (1234) .toString () लंबाई में बदलने की जरूरत है
ओसामा बारी

शीर्ष 3 उत्तरों के लिए बेंचमार्क: मापतो.नेट
रिची बेंडाल

जवाबों:


304
var x = 1234567;

x.toString().length;

यह प्रक्रिया भी Float Numberऔर इसके लिए Exponential numberभी काम करेगी ।


9
+1 किया। यदि यह किसी के लिए स्पष्ट नहीं है, तो फ़्लोट्स में दशमलव बिंदु को स्ट्रिंग की लंबाई में गिना जाएगा। उदाहरण के लिए 2.5.toString ()। लंबाई आउटपुट 3.
dading84

1
@ dading84: मुझे लगता है कि Math.floor () इसे ठीक करेगा: Math.floor (99.5454) .toString () लंबाई === 2
Manfred

7
यह समाधान बड़ी संख्या या छोटी संख्या के साथ काम नहीं करेगा जिसमें 20 से अधिक अंक हों। जैसे। 1.2e + 22 स्ट्रींग ()। लंबाई के आउटपुट 7
चेरिल जी

यह भी ध्यान रखें को यह बेहद धीमी गति से होता है। मैंने नोड में एक परीक्षण किया और यह पता चला कि यह आर्टर्स के उत्तर की तुलना में 1200% से अधिक धीमा है।
ओलिवर डिक्सन

1
यह अच्छा समाधान नहीं है, उदाहरण: const val = 0295; const x = val.toString ()। लंबाई; 3: console.log (एक्स) // उत्पादन होता है
karolkarp

82

ठीक है, इतने सारे उत्तर, लेकिन यह एक शुद्ध गणित है, सिर्फ मज़े के लिए या यह याद रखने के लिए कि गणित महत्वपूर्ण है:

var len = Math.ceil(Math.log(num + 1) / Math.LN10);

यह वास्तव में संख्या की "लंबाई" देता है, भले ही यह घातीय रूप में हो। numयहाँ एक गैर नकारात्मक पूर्णांक माना जाता है: यदि यह नकारात्मक है, तो इसका पूर्ण मान लें और बाद में संकेत समायोजित करें।

ES2015 के लिए अपडेट करें

अब Math.log10यह एक बात है , आप बस लिख सकते हैं

const len = Math.ceil(Math.log10(num + 1));

1
मुझे लगता है कि यह शुद्ध गणित एक सबसे कारगर है / सबसे तेजी से।
Noitidart

2
Awesme सिद्ध आदमी धन्यवाद। जो परिणाम मुझे मिले, उनमें गणित का तरीका तेज है, क्या यह परिणाम आपको मिला है? यहाँ मेरा परिणाम है: i.imgur.com/9BKxyd3.png
Noitidart

1
@HubertGrzeskowiak ओह यह अच्छा है। मुझे लगता है कि विधि मूल रूप से एक गणित है वैसे भी, लेकिन कुछ गति हैक के साथ। यह एक बूँदें Math.ceilऔर Math.absइसके बजाय एक तेजी का उपयोग करता है । लेकिन मुझे ईमानदारी से उम्मीद नहीं थी कि क्रोम में यह प्रदर्शन हासिल होगा ... जानकर अच्छा लगा!
मैक्सआर्ट

3
सही, लेकिन 0 देता है अगर आप संख्या 1 के बजाय 0 है
StateLess

1
1e + 16 या अधिक पर यह 1 कम देता है, इसलिए 10000000000000000 17 के बजाय 16 रिटर्न करता है और ...
Goty Metal

12

मैं नोड.जेएस में इस कार्यक्षमता का उपयोग कर रहा हूं, यह मेरा अब तक का सबसे तेज कार्यान्वयन है:

var nLength = function(n) { 
    return (Math.log(Math.abs(n)+1) * 0.43429448190325176 | 0) + 1; 
}

इसे सकारात्मक और नकारात्मक पूर्णांक (घातीय रूप में भी) को संभालना चाहिए और तैरने में पूर्णांक के भाग की लंबाई वापस करनी चाहिए।

निम्नलिखित संदर्भ को विधि में कुछ अंतर्दृष्टि प्रदान करनी चाहिए: वीसस्टीन, एरिक डब्ल्यू। "संख्या की लंबाई।" मैथवर्ल्ड से - एक वुल्फ्राम वेब संसाधन।

मेरा मानना ​​है कि कुछ बिटवाइज़ ऑपरेशन Math.abs की जगह ले सकते हैं, लेकिन jsperf यह दर्शाता है कि बहुमत के js इंजन में Math.abs ठीक काम करता है।

अद्यतन : टिप्पणियों में उल्लेख किया गया है, इस समाधान में कुछ मुद्दे हैं :(

Update2 (वैकल्पिक हल) : मुझे विश्वास है कि कुछ बिंदु परिशुद्धता के मुद्दों में लात और कम से Math.log(...)*0.434...सिर्फ अप्रत्याशित रूप से व्यवहार करता है। हालांकि, अगर इंटरनेट एक्सप्लोरर या मोबाइल डिवाइस आपके चाय के कप नहीं हैं, तो आप इस ऑपरेशन को Math.log10फ़ंक्शन के साथ बदल सकते हैं । Node.js में मैंने फंक्शन के साथ एक क्विक बेसिक टेस्ट लिखा nLength = (n) => 1 + Math.log10(Math.abs(n) + 1) | 0;और इसके साथ Math.log10ही उम्मीद के मुताबिक काम किया। कृपया ध्यान दें कि Math.log10सार्वभौमिक रूप से समर्थित नहीं है।


जिज्ञासा के रूप में मैं .... इस पर बनाम toString () एक nLength साथ JsPerf विधि का प्रदर्शन किया गया है लंबाई। Jsperf.com/convert-number-to-string-and-get-length/2
Israfil हवीला

हाहा, यह मूल रूप से समाधान है जो मैंने प्रदान किया है! मुझे नहीं पता था कि यह इतना अच्छा प्रदर्शन कर सकता है।
मैक्सआर्ट

2
मुझे क्षमा करें, क्या मैंने समाधान का आविष्कार करने के बारे में कुछ कहा या ऐसा कुछ? आप पोस्ट करने से पहले ध्यान से क्यों नहीं पढ़ते हैं? इस मामले के लिए, स्टीवन वोल्फ्राम के जन्म से पहले ही अल्गॉरेट की खोज की गई थी, और वैसे भी आपके द्वारा लिंक किया गया पेज जावास्क्रिप्ट में कोई समाधान प्रदान नहीं करता है। मैंने , आपके 9 महीने पहले किया था।
मैक्सर्ट

1
"+1" संभवत: Math.abs कॉल के बाहर होना चाहिए: Math.log (Math.abs (n) + 1) ...
ह्यूबर्ट ग्रेज्सकोविआक

1
1e + 16 या अधिक पर यह 1 कम देता है, इसलिए 10000000000000000 17 के बजाय 16 रिटर्न करता है और ...
Goty Metal

11

आपको लंबाई लेने के लिए स्ट्रिंग को संख्या बनाना होगा

var num = 123;

alert((num + "").length);

या

alert(num.toString().length);

9

एक टेम्पलेट स्ट्रिंग का उपयोग भी कर सकता है:

const num = 123456
`${num}`.length // 6

यह एकमात्र उत्तर है जो मेरे लिए काम करता है क्योंकि मैं एक संख्या गिनता हूं जो 0.
jessiPP

5

अच्छी तरह से पूर्णांक को स्ट्रिंग में परिवर्तित किए बिना आप फंकी लूप बना सकते हैं:

var number = 20000;
var length = 0;
for(i = number; i > 1; ++i){
     ++length;
     i = Math.floor(i/10);
}

alert(length);​

डेमो: http://jsfiddle.net/maniator/G8tQE/


3
@ हाँ, यह पूर्णांक मान रहा है । यहां तक ​​कि अगर आप इसे एक स्ट्रिंग बनाते हैं, तो यह .गणना के हिस्से के रूप में शामिल होगा ।
नफ्तली उर्फ ​​नील

हां, हालांकि यह एक दिलचस्प दार्शनिक सवाल है कि क्या डॉट को "लंबाई" में शामिल किया जाना चाहिए :-)
पोइंटी

4

पहले इसे एक स्ट्रिंग में बदलें:

var mynumber = 123;
alert((""+mynumber).length);

इसमें एक खाली स्ट्रिंग जोड़ने से यह mynumberएक स्ट्रिंग में बदल जाएगा।


1
1e + 16 जैसे एक्सपोनेंशियल के साथ काम नहीं करता है, जो कि रिटर्न 5.
गॉट्टी मेटल

4

इसे करने के तीन तरीके हैं।

var num = 123;
alert(num.toString().length);

बेहतर प्रदर्शन एक (ie11 में सर्वश्रेष्ठ प्रदर्शन)

var num = 123;
alert((num + '').length);

गणित (क्रोम में सर्वश्रेष्ठ प्रदर्शन, फ़ायरफ़ॉक्स लेकिन ie11 में सबसे धीमा)

var num = 123
alert(Math.floor( Math.log(num) / Math.LN10 ) + 1)

यहाँ एक jspref है http://jsperf.com/fastest-way-to-get-the-first-in-a-number/2


4

आपको सबसे सरल एक (stringLength) के लिए जाना चाहिए, पठनीयता हमेशा गति को धड़कती है। लेकिन अगर आप यहाँ गति के बारे में परवाह करते हैं तो कुछ नीचे हैं।

तीन अलग-अलग विधियां अलग-अलग गति के साथ।

// 34ms
let weissteinLength = function(n) { 
    return (Math.log(Math.abs(n)+1) * 0.43429448190325176 | 0) + 1;
}

// 350ms
let stringLength = function(n) {
    return n.toString().length;
}

// 58ms
let mathLength = function(n) {
    return Math.ceil(Math.log(n + 1) / Math.LN10);
}

// Simple tests below if you care about performance.

let iterations = 1000000;
let maxSize = 10000;

// ------ Weisstein length.

console.log("Starting weissteinLength length.");
let startTime = Date.now();

for (let index = 0; index < iterations; index++) {
    weissteinLength(Math.random() * maxSize);
}

console.log("Ended weissteinLength length. Took : " + (Date.now() - startTime ) + "ms");


// ------- String length slowest.

console.log("Starting string length.");
startTime = Date.now();

for (let index = 0; index < iterations; index++) {
    stringLength(Math.random() * maxSize);
}

console.log("Ended string length. Took : " + (Date.now() - startTime ) + "ms");


// ------- Math length.

console.log("Starting math length.");
startTime = Date.now();

for (let index = 0; index < iterations; index++) {
    mathLength(Math.random() * maxSize);
}

3

मुझे एक परीक्षण में एक समान प्रश्न पूछा गया।

स्ट्रिंग में कनवर्ट किए बिना संख्या की लंबाई ज्ञात करें

const numbers = [1, 10, 100, 12, 123, -1, -10, -100, -12, -123, 0, -0]

const numberLength = number => {

  let length = 0
  let n = Math.abs(number)

  do {
    n /=  10
    length++
  } while (n >= 1)

  return length
}

console.log(numbers.map(numberLength)) // [ 1, 2, 3, 2, 3, 1, 2, 3, 2, 3, 1, 1 ]

इसे थोड़ा और जटिल करने के लिए ऋणात्मक संख्याएँ जोड़ी गईं, इसलिए Math.abs ()।


2

मैं @ उत्तर को सही करना चाहूंगा जो पूर्णांकों के लिए बहुत अच्छा था, लेकिन नंबर 1 पिछले मामले में 0 की लंबाई लौटाएगा।

function Longueur(numberlen)
{
    var length = 0, i; //define `i` with `var` as not to clutter the global scope
    numberlen = parseInt(numberlen);
    for(i = numberlen; i >= 1; i)
    {
        ++length;
        i = Math.floor(i/10);
    }
    return length;
}


0

हां, आपको लंबाई खोजने के लिए स्ट्रिंग में बदलने की आवश्यकता है। उदाहरण के लिए

var x=100;// type of x is number
var x=100+"";// now the type of x is string
document.write(x.length);//which would output 3.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.