Nhận số chữ số với JavaScript


124

Như tiêu đề của bài viết của tôi cho thấy, tôi muốn biết có bao nhiêu chữ số var number. Ví dụ: Nếu number = 15;chức năng của tôi sẽ trở lại 2. Hiện tại, nó trông như thế này:

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

Nhưng Safari nói rằng nó không hoạt động do TypeError:

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

Như bạn có thể thấy, '2'thực sự là giải pháp đúng đắn. Nhưng tại sao vậy not a function?

Câu trả lời:


229

lengthlà một tài sản, không phải là một phương pháp. Bạn không thể gọi nó, do đó bạn không cần dấu ngoặc đơn ():

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

CẬP NHẬT: Như đã thảo luận trong các ý kiến, ví dụ trên sẽ không hoạt động đối với số float. Để làm cho nó hoạt động, chúng ta có thể loại bỏ một khoảng thời gian với String(number).replace('.', '').lengthhoặc đếm các chữ số có biểu thức chính quy : String(number).match(/\d/g).length.

Về mặt tốc độ có khả năng cách nhanh nhất để có được số chữ số trong số đã cho là thực hiện theo cách toán học. Đối với các số nguyên dương, có một thuật toán tuyệt vời với log10:

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

Đối với tất cả các loại số nguyên (bao gồm cả phủ định), có một giải pháp tối ưu hóa tuyệt vời từ @ Mwr247 , nhưng hãy cẩn thận khi sử dụng Math.log10, vì nó không được hỗ trợ bởi nhiều trình duyệt cũ. Vì vậy, thay thế Math.log10(x)bằng Math.log(x) * Math.LOG10Esẽ giải quyết vấn đề tương thích.

Tạo các giải pháp toán học nhanh cho các số thập phân sẽ không dễ dàng do hành vi nổi tiếng của toán học dấu phẩy động , do đó, cách tiếp cận theo chuỗi sẽ dễ dàng hơn và chứng minh đánh lừa. Như đã đề cập bởi @streetlogics, việc truyền nhanh có thể được thực hiện với số đơn giản để nối chuỗi, dẫn đến giải pháp thay thế được chuyển thành:

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

3
kỹ thuật tốt để không có chữ số, nhưng, nếu đó là một số phân số, tức là 12,5, thì hàm của bạn sẽ trả về 4 thay vì 3 ...
Swarnendu Paul

@Swarnendu: Không có vấn đề gì vì tôi chỉ có số nguyên.
bit4fox

3
Nếu không thì chỉ cần sử dụng một cái gì đó như number.toString().match(/\d/g).length.
VisioN

1
@Bakudan - Câu trả lời này dường như đã được sửa. Bạn có thể xóa hai bình luận của mình để phê bình ngay bây giờ (để mọi người trong tương lai không bị nhầm lẫn và nghĩ rằng mã trong câu trả lời này không hoạt động.)
ArtOfWarfare

1
@ 3ocene Đoán tốt! Giá trị giữ nguyên nhưng đằng sau cảnh nó được chuyển thành số nguyên. x | 0chỉ là một phiên bản ngắn và nhanh khác Math.floor(x), làm tròn số. Bạn có thể đạt được điều tương tự với ~~x. Câu hỏi sau đây cung cấp giải thích thêm về điểm: stackoverflow.com/q/9049677/1249581 .
VisioN

65

Đây là một câu trả lời toán học (cũng hoạt động cho các số âm):

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

Và một phiên bản tối ưu hóa ở trên (hoạt động bitwise hiệu quả hơn):

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

Về cơ bản, chúng tôi bắt đầu bằng cách lấy giá trị tuyệt đối của đầu vào để cho phép các giá trị âm hoạt động chính xác. Sau đó, chúng tôi chạy hoạt động thông qua log10 để cung cấp cho chúng tôi sức mạnh của 10 đầu vào là gì (nếu bạn đang làm việc ở một cơ sở khác, bạn sẽ sử dụng logarit cho cơ sở đó), đó là số chữ số. Sau đó, chúng tôi sàn đầu ra để chỉ lấy phần nguyên của đó. Cuối cùng, chúng tôi sử dụng hàm max để sửa các giá trị thập phân (bất kỳ giá trị phân số nào từ 0 đến 1 chỉ trả về 1, thay vì số âm) và thêm 1 vào đầu ra cuối cùng để lấy số đếm.

Các giả định ở trên (dựa trên đầu vào ví dụ của bạn) mà bạn muốn đếm số chữ số trong các số nguyên (vì vậy 12345 = 5, và do đó 12345.678 = 5 cũng vậy). Nếu bạn muốn đếm tổng số chữ số trong giá trị (vì vậy 12345.678 = 8), sau đó thêm số này vào trước 'return' trong một trong hai chức năng trên:

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


2
@ Tx3 Lưu ý tốt! Rất may, Math.LOG10Eđã tồn tại từ ES1, có nghĩa là Math.log(x) * Math.LOG10Esẽ hoạt động để tương thích.
Mwr247

Tôi nghĩ hàm này không hoạt động: `` `hàm numDigits (x) {return (Math.log10 ((x ^ (x >> 31)) - (x >> 31)) | 0) + 1; } `` `numDigits (1234567891) -> 10 numDigits (12345678912) -> 9
lokhmakov

@lokhmakov Đó là vì số thứ hai bạn đã cung cấp vượt quá giá trị số nguyên tối đa 32 bit của JavaScript, mà các toán tử bitwise (^, >>, |) không thể xử lý chính xác.
Mwr247

1
Thật. Mọi người nên mong đợi rằng JS chỉ hoạt động với int an toàn tối đa và con số đó lớn hơn nhiều so với hầu hết mọi người cần cho bất cứ điều gì. Tôi đang phát triển một trò chơi với số lượng rất lớn và không thể sử dụng mã được tối ưu hóa vì giới hạn đó và đã nhận ra tôi sẽ nhận xét để cứu bất kỳ ai khác trong một chiếc thuyền tương tự khỏi bị hỏng mã sau đó. Bằng cách trả lời tuyệt vời.
Justin

20

Vì điều này xuất hiện trên một tìm kiếm của Google về "javascript lấy số chữ số", tôi muốn ném nó ra rằng có một giải pháp thay thế ngắn hơn dựa trên việc truyền nội bộ sẽ được thực hiện cho bạn:

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

Sản lượng

3 4

4
Và một jsperf nhanh chóng cho thấy rằng điều này cũng NHIỀU nhanh hơn (như trong, 10 lần trở lên): jsperf.com/number-tostring-vs-number
Ledivin

GHI CHÚ! Đếm số chấm là một số quá. (theo dec_number)
Sebastian Norr

2

Nếu bạn cần chữ số (sau dấu phân cách), bạn chỉ cần chia số và đếm phần thứ hai (sau điểm).

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

Tôi vẫn còn học Javascript nhưng tôi đã tìm ra hàm này trong C một thời gian trước, nó sử dụng toán học và vòng lặp while chứ không phải là một chuỗi nên tôi đã viết lại nó cho Javascript. Có thể điều này có thể được thực hiện đệ quy bằng cách nào đó nhưng tôi vẫn chưa thực sự nắm bắt được khái niệm :( Đây là điều tốt nhất tôi có thể nghĩ ra. Tôi không chắc nó hoạt động với số lượng lớn như thế nào, nó hoạt động khi tôi đưa vào hàng trăm chữ số.

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

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

chỉnh sửa: chỉ hoạt động với các giá trị nguyên


1

Lưu ý: Hàm này sẽ bỏ qua các số sau dấu chấm thập phân có nghĩa là thập phân , Nếu bạn muốn đếm bằng số thập phân thì hãy xóa Math.floor(). Trực tiếp đến điểm kiểm tra này ra!

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

Về cơ bản những gì đang xảy ra ở đây. toString()String()cùng chức năng xây dựng để chuyển đổi chữ số thành chuỗi, khi chúng tôi đã chuyển đổi, chúng tôi sẽ tìm thấy độ dài của chuỗi bằng chức năng tích hợp length.

Thông báo: Nhưng chức năng này sẽ không hoạt động đúng với số âm, nếu bạn đang cố chơi với số âm thì hãy kiểm tra câu trả lời này Hoặc đơn giản đặt Math.abs()vào đó;

Chúc mừng bạn


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

Hai chữ số: hàm đơn giản trong trường hợp bạn cần hai hoặc nhiều chữ số của một số với ECMAScript 6 (ES6):

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

0

Báo cáo sự cố: Đếm số / chuỗi không sử dụng chuỗi.length () jsfactor. Giải pháp: chúng ta có thể làm điều này thông qua Forloop. ví dụ

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

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

else{
  this.number = this.y;
}    

}


0

Đây là giải pháp của tôi. Nó hoạt động với các số dương và âm. Hi vọng điêu nay co ich

function findDigitAmount(num) {

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

 return lengthNumber.length;
}


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

0

nó sẽ đơn giản để có được chiều dài như

  `${NUM}`.length

Trong đó NUM là số để lấy độ dài cho


0

Bạn có thể sử dụng trong thủ thuật này

(''+number).length


0

Vui lòng sử dụng biểu thức sau để có được độ dài của số.

length = variableName.toString().length

-7

Thuộc tính độ dài trả về độ dài của một chuỗi (số ký tự).

Độ dài của một chuỗi rỗng là 0.

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

Kết quả của n sẽ là: 12

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

Kết quả của n sẽ là: 0


Độ dài mảng Thuộc tính:


Thuộc tính độ dài đặt hoặc trả về số lượng phần tử trong một mảng.

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

Kết quả sẽ là: 4

Cú pháp:

Trả về độ dài của một mảng:

array.length

Đặt độ dài của một mảng:

array.length=number

2
Điều này không trả lời cho câu hỏi
Steve Taylor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.