JavaScript ile basamak sayısını alın


124

Yazımın başlığından da anlaşılacağı gibi, kaç hanenin olduğunu bilmek istiyorum var number. Örneğin: number = 15;İşlevim dönerse 2. Şu anda şuna benziyor:

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

Ancak Safari, aşağıdaki nedenlerden dolayı çalışmadığını söylüyor TypeError:

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

Gördüğünüz gibi '2', aslında doğru çözüm. Ama neden öyle not a function?

Yanıtlar:


229

lengthbir özelliktir, bir yöntem değildir. Onu arayamazsınız, bu nedenle paranteze ihtiyacınız yoktur ():

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

GÜNCELLEME: Yorumlarda tartışıldığı gibi, yukarıdaki örnek kayan sayılar için çalışmayacaktır. Biz ya bir süre kurtulabilirsiniz çalışma yapmak için String(number).replace('.', '').length, ya da düzenli ifade ile haneleri saymak: String(number).match(/\d/g).length.

Hız açısından, potansiyel olarak verilen sayıdaki basamak sayısını almanın en hızlı yolu, bunu matematiksel olarak yapmaktır. İçin pozitif tamsayılar harika bir algoritma ile vardır log10:

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

Tüm tam sayı türleri (negatifler dahil) için, @ Mwr247'den mükemmel bir optimize edilmiş çözüm vardır , ancak Math.log10birçok eski tarayıcı tarafından desteklenmediği için kullanırken dikkatli olun . Değiştirilmesi Yani Math.log10(x)ile Math.log(x) * Math.LOG10Euyumluluk sorunu çözecektir.

Ondalık sayılar için hızlı matematiksel çözümler oluşturmak , kayan noktalı matematiğin iyi bilinen davranışı nedeniyle kolay olmayacaktır , bu nedenle dizgeye atama yaklaşımı daha kolay ve aptalca kanıtlanacaktır. @Streetlogics tarafından belirtildiği gibi hızlı çevrim, basit sayıdan dizgeye birleştirme ile yapılabilir ve değiştirme çözümünün şu şekle dönüştürülmesine yol açar:

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

3
rakam elde etmek için iyi bir teknik, ama ya bu bir kesir sayısı ise, yani 12.5, o zaman fonksiyonunuz 3 yerine 4 döndürür ...
Swarnendu Paul

@Swarnendu: Sorun değil çünkü sadece tamsayılarım var.
bit4fox

3
Aksi takdirde sadece şöyle bir şey kullanın number.toString().match(/\d/g).length.
VisioN

1
@Bakudan - Bu cevap düzeltilmiş görünüyor. Şimdi eleştirerek iki yorumunuzu silebilirsiniz (böylece gelecekteki insanların kafası karışmasın ve bu cevaptaki kodun çalışmadığını
düşünmesin

1
@ 3ocene İyi tahmin! Değer aynı kalır ancak sahnenin arkasında tam sayıya çevrilir. sayıyı aşağı yuvarlayan x | 0başka bir kısa ve hızlı sürümüdür Math.floor(x). İle aynı şeyi başarabilirsiniz ~~x. Aşağıdaki soru bu konuda daha fazla açıklama sağlar: stackoverflow.com/q/9049677/1249581 .
VisioN

66

İşte matematiksel bir cevap (negatif sayılar için de geçerlidir):

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

Ve yukarıdakilerin optimize edilmiş bir versiyonu (daha verimli bitsel işlemler):

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

Esasen, negatif değerlerin doğru çalışmasına izin vermek için girdinin mutlak değerini alarak işe başlıyoruz. Daha sonra, girişin 10'un hangi gücünü bize vermek için log10 işlemini gerçekleştiriyoruz (başka bir tabanda çalışıyor olsaydınız, o taban için logaritmayı kullanırdınız) ki bu rakam sayısıdır. Sonra çıktıyı sadece tam sayı kısmını kapacak şekilde yerleştiririz. Son olarak, ondalık değerleri sabitlemek için max işlevini kullanırız (0 ile 1 arasındaki herhangi bir kesirli değer, negatif sayı yerine yalnızca 1 döndürür) ve sayımı elde etmek için son çıktıya 1 ekleriz.

Yukarıdakiler (örnek girişinize göre) basamakların sayısını tamsayı olarak saymak istediğinizi varsayar (yani 12345 = 5 ve dolayısıyla 12345.678 = 5). Değerdeki toplam basamak sayısını saymak istiyorsanız (yani 12345.678 = 8), bunu yukarıdaki işlevlerden herhangi birinde 'return' öğesinin önüne ekleyin:

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


2
@ Tx3 İyi not! Neyse ki, Math.LOG10EES1'den beri var, bu da Math.log(x) * Math.LOG10Euyumluluk için çalışacağı anlamına geliyor .
Mwr247

Bu fonksiyonun çalışmadığını düşünüyorum: `` `function numDigits (x) {return (Math.log10 ((x ^ (x >> 31)) - (x >> 31)) | 0) + 1; } `` numDigits (1234567891) -> 10 numDigits (12345678912) -> 9
lokhmakov

@lokhmakov Bunun nedeni, verdiğiniz ikinci sayının JavaScript'in maksimum 32-bit tamsayı değerini aşması, bitsel operatörler (^, >>, |) doğru şekilde işleyemez.
Mwr247

1
Doğru. JS'nin yalnızca max safe int ile çalışması beklenmelidir ve bu sayı hemen hemen herkesin herhangi bir şeye ihtiyaç duyacağından çok daha büyüktür. Çok büyük sayılara sahip bir oyun geliştiriyorum ve bu sınırlamadan dolayı optimize edilmiş kodu kullanamıyorum ve benzer bir teknedeki başka herhangi birinin daha sonra kodu kırmaktan kurtarmak için yorum yapacağımı düşündüm. Bu arada harika cevap.
Justin

20

Bu, "javascript basamak sayısını al" için bir Google aramasında ortaya çıktığından, bunun sizin için yapılması gereken dahili yayınlamaya dayanan daha kısa bir alternatifi olduğunu ortaya çıkarmak istedim:

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);

Verim

3 4

4
Ve hızlı bir jsperf bunun da ÇOK daha hızlı olduğunu gösteriyor (10x veya daha fazla olduğu gibi): jsperf.com/number-tostring-vs-number
Ledivin

NOT! Noktayı da bir sayı olarak sayar. (dec_number olarak)
Sebastian Norr

2

Basamaklara ihtiyacınız varsa (ayırıcıdan sonra), sayıyı bölebilir ve uzunluğun ikinci kısmını (noktadan sonra) sayabilirsiniz.

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

Hâlâ Javascript öğreniyorum ama bir süre önce C de bu işlevi buldum, bu işlev bir dizeden ziyade matematik ve bir while döngüsü kullanıyor, bu yüzden Javascript için yeniden yazdım. Belki bu bir şekilde yinelemeli olarak yapılabilir ama yine de kavramı tam olarak kavrayamadım :( Bulabildiğim en iyisi bu. Ne kadar büyük sayılarla çalıştığından emin değilim, yüz koyduğumda işe yaradı. basamak.

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

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

düzenleme: yalnızca tamsayı değerleriyle çalışır


1

Not: Bu işlev , ondalık ortalama noktasından sonraki sayıları yok sayacaktır , ondalık ile saymak istiyorsanız, o zaman kaldırın . Doğrudan noktaya bunu kontrol edin!Math.floor()

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

 digitCount(2343) ;

// ES5 +

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

 console.log(digitCount2(3343))

Temelde burada neler oluyor. toString()ve String()basamağı dizeye dönüştürmek için aynı yerleşik işlev, bir kez dönüştürdükten sonra dizenin uzunluğunu yerleşik işlevle bulacağız length.

Uyarı: Ama bu fonksiyon negatif sayı için düzgün çalışmayacaktır, eğer negatif sayı ile oynamaya çalışıyorsanız, o zaman bu cevabı kontrol edin Veya basitçe ekleyin Math.abs();

Cheer You!


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

İki hane: ECMAScript 6 (ES6) ile bir sayının iki veya daha fazla hanesine ihtiyaç duymanız durumunda basit işlev:

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

0

Problem ifadesi: string.length () jsfunction kullanmayan sayıyı / dizeyi sayın. Çözüm: Bunu Forloop aracılığıyla yapabiliriz. Örneğin

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

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

else{
  this.number = this.y;
}    

}


0

İşte benim çözümüm. Pozitif ve negatif sayılarla çalışır. Bu yardımcı olur umarım

function findDigitAmount(num) {

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

 return lengthNumber.length;
}


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

0

uzunluğu almak basit olurdu

  `${NUM}`.length

NUM, uzunluğu alınacak sayıdır


0

Bu numarada kullanabilirsin

(''+number).length


0

Numaranın uzunluğunu öğrenmek için lütfen aşağıdaki ifadeyi kullanın.

length = variableName.toString().length

-7

Length özelliği, bir dizenin uzunluğunu (karakter sayısı) döndürür.

Boş bir dizenin uzunluğu 0'dır.

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

N'nin sonucu şöyle olacaktır: 12

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

N'nin sonucu: 0 olacaktır


Dizi uzunluğu Özelliği:


Length özelliği, bir dizideki öğelerin sayısını ayarlar veya döndürür.

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

Sonuç şu şekilde olacaktır: 4

Sözdizimi:

Bir dizinin uzunluğunu döndür:

array.length

Bir dizinin uzunluğunu ayarlayın:

array.length=number

2
Bu soruya yanıt vermiyor
Steve Taylor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.