Dapatkan jumlah digit dengan JavaScript

124

Seperti yang disarankan oleh judul posting saya, saya ingin tahu berapa digit yang var numberdimiliki. Misalnya: Jika number = 15;fungsi saya harus kembali 2. Saat ini, tampilannya seperti ini:

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

Tetapi Safari mengatakan itu tidak berfungsi karena TypeError:

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

Seperti yang Anda lihat, '2'sebenarnya adalah solusi yang tepat. Tapi kenapa begitu not a function?

bit4fox
sumber

Jawaban:

229

lengthadalah properti, bukan metode. Anda tidak dapat menyebutnya, maka Anda tidak perlu tanda kurung ():

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

PEMBARUAN: Seperti yang dibahas di komentar, contoh di atas tidak akan berfungsi untuk nomor float. Untuk membuatnya bekerja, kita bisa menghilangkan titik dengan String(number).replace('.', '').length, atau menghitung angka dengan ekspresi reguler:String(number).match(/\d/g).length .

Dalam hal kecepatan, cara tercepat untuk mendapatkan jumlah digit dalam bilangan tertentu adalah dengan melakukannya secara matematis. Untuk bilangan bulat positif ada algoritma yang bagus dengan log10:

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

Untuk semua jenis bilangan bulat (termasuk negatif) ada solusi optimal yang brilian dari @ Mwr247 , tetapi hati-hatilah saat menggunakannya Math.log10, karena tidak didukung oleh banyak browser lama. Jadi, mengganti Math.log10(x)dengan Math.log(x) * Math.LOG10Eakan menyelesaikan masalah kompatibilitas.

Membuat solusi matematika yang cepat untuk bilangan desimal tidak akan mudah karena perilaku matematika floating point yang terkenal , sehingga pendekatan cast-to-string akan lebih mudah dan bukti yang bodoh. Seperti yang disebutkan oleh @streetlogics, pengecoran cepat dapat dilakukan dengan penggabungan angka ke string, yang mengarahkan solusi penggantian untuk diubah menjadi:

var length = (number + '').replace('.', '').length;  // for floats
Penglihatan
sumber
3
teknik yang bagus untuk mendapatkan angka tidak ada, tetapi, bagaimana jika itu adalah bilangan pecahan, yaitu, 12,5, maka fungsi Anda akan mengembalikan 4, bukan 3 ...
Swarnendu Paul
@Swarnendu: Itu tidak masalah karena saya baru saja bilangan bulat.
bit4fox
3
Jika tidak, gunakan saja sesuatu seperti number.toString().match(/\d/g).length.
VisioN
1
@ Bakudan - Jawaban ini tampaknya telah diperbaiki. Anda dapat menghapus dua komentar Anda yang mengkritiknya sekarang (agar orang-orang di masa depan tidak bingung dan berpikir kode dalam jawaban ini tidak berfungsi.)
ArtOfWarfare
1
@ 3ocene Tebakan bagus! Nilainya tetap sama tetapi di belakang layar itu dicor ke integer. x | 0hanyalah versi singkat dan cepat dari Math.floor(x), yang membulatkan angkanya. Anda dapat mencapai hal yang sama dengan ~~x. Pertanyaan berikut memberikan penjelasan lebih lanjut tentang hal ini: stackoverflow.com/q/9049677/1249581 .
VisioN
66

Berikut jawaban matematis (juga berlaku untuk bilangan negatif):

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

Dan versi yang dioptimalkan dari yang di atas (operasi bitwise yang lebih efisien):

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

Pada dasarnya, kita mulai dengan mendapatkan nilai absolut dari input agar nilai negatif dapat berfungsi dengan benar. Kemudian kami menjalankan operasi melalui log10 untuk memberi kami pangkat 10 input (jika Anda bekerja di basis lain, Anda akan menggunakan logaritma untuk basis itu), yang merupakan jumlah digit. Kemudian kita lantai output hanya mengambil bagian integer itu. Terakhir, kami menggunakan fungsi max untuk memperbaiki nilai desimal (nilai pecahan apa pun antara 0 dan 1 hanya mengembalikan 1, bukan angka negatif), dan menambahkan 1 ke hasil akhir untuk menghitungnya.

Asumsi di atas (berdasarkan masukan contoh Anda) bahwa Anda ingin menghitung jumlah digit dalam bilangan bulat (jadi 12345 = 5, dan dengan demikian 12345,678 = 5 juga). Jika Anda ingin menghitung jumlah total digit dalam nilai (jadi 12345.678 = 8), tambahkan ini sebelum 'return' di salah satu fungsi di atas:

x = Number(String(x).replace(/[^0-9]/g, ''));
Mwr247
sumber
3
Catatan: Math.log10 adalah pengembang
Tx3
2
@ Tx3 Catatan bagus! Untungnya, Math.LOG10Esudah ada sejak ES1, yang artinya Math.log(x) * Math.LOG10Eakan berfungsi untuk kompatibilitas.
Mwr247
Saya pikir fungsi ini tidak berfungsi: `` `` function numDigits (x) {return (Math.log10 ((x ^ (x >> 31)) - (x >> 31)) | 0) + 1; } `` numDigits (1234567891) -> 10 numDigits (12345678912) -> 9
lokhmakov
@lokhmakov Itu karena angka kedua yang Anda berikan melebihi nilai integer 32-bit maks JavaScript, yang tidak dapat ditangani oleh operator bitwise (^, >>, |) dengan benar.
Mwr247
1
Benar. Kita harus berharap bahwa JS hanya bekerja dengan int max safe, dan angka itu jauh lebih besar daripada yang dibutuhkan hampir semua orang untuk apa pun. Saya sedang mengembangkan permainan dengan jumlah yang sangat besar dan tidak dapat menggunakan kode yang dioptimalkan karena batasan itu, dan saya pikir saya akan berkomentar untuk menyelamatkan orang lain di kapal yang sama agar tidak rusak kode di kemudian hari. Jawaban yang bagus.
Justin
20

Karena ini muncul pada pencarian Google untuk "javascript get number of digit", saya ingin membuangnya di sana bahwa ada alternatif yang lebih pendek untuk ini yang bergantung pada casting internal yang harus dilakukan untuk Anda:

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

Hasil

3 4
streetlogics
sumber
4
Dan jsperf cepat menunjukkan bahwa ini JAUH lebih cepat, juga (seperti dalam, 10x atau lebih): jsperf.com/number-tostring-vs-number
Ledivin
CATATAN! Menghitung titik sebagai angka juga. (dalam dec_number)
Sebastian Norr
2

Jika Anda membutuhkan angka (setelah pemisah), Anda cukup membagi angka dan menghitung panjang bagian kedua (setelah titik).

function countDigits(number) {
    var sp = (number + '').split('.');
    if (sp[1] !== undefined) {
        return sp[1].length;
    } else {
        return 0;
    }
}
Maciej Maciej
sumber
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

pengguna40521
sumber
1

Saya masih belajar Javascript tetapi saya menemukan fungsi ini di C beberapa waktu yang lalu, yang menggunakan matematika dan loop sementara daripada string jadi saya menulis ulang untuk Javascript. Mungkin ini bisa dilakukan secara rekursif, tetapi saya masih belum benar-benar memahami konsepnya :( Ini adalah yang terbaik yang bisa saya hasilkan. Saya tidak yakin berapa besar angka yang berhasil, itu berhasil ketika saya memasukkan seratus digit.

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

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

edit: hanya bekerja dengan nilai integer

Nate
sumber
1

Catatan: Fungsi ini akan mengabaikan angka setelah titik rata-rata desimal , Jika Anda ingin menghitung dengan desimal, hapus Math.floor(). Langsung ke intinya lihat ini!

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

Pada dasarnya Apa yang terjadi di sini. toString()dan String()fungsi built-in yang sama untuk mengubah digit menjadi string, setelah kita dikonversi maka kita akan menemukan panjang string dengan fungsi built-in length.

Peringatan: Tetapi fungsi ini tidak akan berfungsi dengan baik untuk angka negatif, jika Anda mencoba bermain dengan angka negatif maka periksa jawaban ini Atau letakkan sederhana Math.abs()di dalamnya;

Menyemangatimu!

Kode
sumber
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));
Rajat Srivastava
sumber
0

Dua digit: fungsi sederhana jika Anda memerlukan dua atau lebih digit angka dengan ECMAScript 6 (ES6):

const zeroDigit = num => num.toString().length === 1 ? `0${num}` : num;
Rafael Melón
sumber
0

Pernyataan masalah: Hitung nomor / string tidak menggunakan string.length () jsfunction. Solusi: kita bisa melakukan ini melalui Forloop. misalnya

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

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

else{
  this.number = this.y;
}    

}

Yogesh Aggarwal
sumber
0

Inilah solusi saya. Ia bekerja dengan bilangan positif dan negatif. Semoga ini membantu

function findDigitAmount(num) {

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

 return lengthNumber.length;
}


(findDigitAmount(-96456431);    // 8
(findDigitAmount(1524):         // 4
Juliana Melo
sumber
0

itu akan sederhana untuk mendapatkan panjang sebagai

  `${NUM}`.length

di mana NUM adalah angka untuk mendapatkan panjangnya

AP
sumber
0

Anda bisa menggunakan trik ini

(''+number).length

Idan
sumber
0

Silakan gunakan ekspresi berikut untuk mendapatkan panjang nomor tersebut.

length = variableName.toString().length
Priya Shalini
sumber
-7

Properti panjang mengembalikan panjang string (jumlah karakter).

Panjang string kosong adalah 0.

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

Hasil dari n akan menjadi: 12

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

Hasil dari n akan menjadi: 0


Properti panjang array:


Properti panjang mengatur atau mengembalikan jumlah elemen dalam larik.

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

Hasilnya adalah: 4

Sintaksis:

Kembalikan panjang array:

array.length

Atur panjang sebuah array:

array.length=number
Muhammad Awais
sumber
2
Ini tidak menanggapi pertanyaan
Steve Taylor