Отримайте кількість цифр за допомогою JavaScript


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, то ваша функція поверне 4 замість 3 ...
Swarnendu Paul

@Swarnendu: Це не проблема, оскільки у мене просто цілі числа.
bit4fox

3
Інакше просто використовуйте щось подібне number.toString().match(/\d/g).length.
VisioN

1
@Bakudan - ця відповідь, схоже, була виправлена. Ви можете видалити свої два коментарі, що критикують його зараз (щоб майбутні люди не плуталися і думали, що код у цій відповіді не працює.)
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;
}

По суті, ми починаємо з отримання абсолютного значення введення, щоб дозволити негативним значенням працювати правильно. Потім ми запускаємо операцію log10, щоб дати нам, яка потужність входу 10 (якби ви працювали в іншій базі, ви використовували б логарифм для цієї бази), яка кількість цифр. Тоді ми перекриваємо вихід, щоб лише захопити цілу частину цього. Нарешті, ми використовуємо функцію max для фіксації десяткових значень (будь-яке дробове значення між 0 і 1 просто повертає 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.LOG10Eіснує з ES1, що означає, що він Math.log(x) * Math.LOG10Eбуде працювати на сумісність.
Mwr247

Я думаю, що ця функція не працює: `` `функція numDigits (x) {return (Math.log10 ((x ^ (x >> 31)) - (x >> 31)) | 0) + 1; } `` `numDigits (1234567891) -> 10 numDigits (12345678912) -> 9
lokhmakov

@lokhmakov Це тому, що друге число, яке ви надали, перевищує максимальне 32-бітове ціле значення JavaScript, з яким побітові оператори (^, >>, |) не можуть правильно обробити.
Mwr247

1
Правда. Слід очікувати, що JS працює лише з максимальним безпечним int, і це число набагато більше, ніж майже кому-небудь потрібно. Я розробляю гру з дуже великою кількістю, і не можу використовувати оптимізований код через це обмеження, і я подумав, що врятую когось іншого в подібному човні від того, щоб зламати код згодом за лінією. Чудова відповідь до речі.
Джастін

20

Оскільки це з'явилося в пошуку Google для "javascript отримати кількість цифр", я хотів викинути його там, що існує більш коротка альтернатива цьому, яка покладається на внутрішній кастинг, який слід зробити для вас:

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 показує, що це МНОГО швидше (як, у 10 разів або більше): jsperf.com/number-tostring-vs-number
Ledivin

ПРИМІТКА! Точка вважається також числом. (у грудні_кілька)
Себастьян Норр

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

Я як і раніше вивчаю Javascript, але я придумав цю функцію в C деякий час тому, який використовує математику і цикл часу, а не рядок, тому я переписав її для Javascript. Можливо, це можна зробити якось рекурсивно, але я все ще не дуже зрозумів цю концепцію :( Це найкраще, що я міг би придумати. Я не впевнений, наскільки велика кількість це працює, вона спрацювала, коли я поставив у сотню цифр.

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

// ES5 +

 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

Двозначні цифри: проста функція, якщо вам потрібно дві або більше цифр числа з ECMAScript 6 (ES6):

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

0

Постановка проблеми: Підрахунок числа / рядка не використовує функцію string.length () . Рішення: ми могли б зробити це через 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

Властивість length повертає довжину рядка (кількість символів).

Довжина порожнього рядка - 0.

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

Результатом n буде: 12

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

Результатом n буде: 0


Властивість масиву:


Властивість length встановлює або повертає кількість елементів у масиві.

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

Результат буде: 4

Синтаксис:

Повернути довжину масиву:

array.length

Встановіть довжину масиву:

array.length=number

2
Це не відповідає на запитання
Стів Тейлор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.