Получите количество цифр с помощью JavaScript

124

Как следует из названия моего сообщения, я хотел бы знать, сколько цифр в var numberнем. Например: если number = 15;моя функция должна вернуться 2. В настоящее время это выглядит так:

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

Но Safari сообщает, что он не работает из-за TypeError:

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

Как видите, '2'это действительно правильное решение. Но почему not a function?

bit4fox
источник

Ответы:

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: Это не проблема, потому что у меня есть только целые числа.
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, ''));
Mwr247
источник
3
Примечание: Math.log10 - это функция ES6 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Tx3
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 Это потому, что второе число, которое вы указали, превышает максимальное 32-битное целочисленное значение JavaScript, которое побитовые операторы (^, >>, |) не могут обрабатывать правильно.
Mwr247
1
Правда. Следует ожидать, что JS работает только с max safe int, и это число намного больше, чем кому-либо понадобится. Я разрабатываю игру с очень большими числами и не могу использовать оптимизированный код из-за этого ограничения, и решил, что прокомментирую, чтобы спасти кого-либо еще в подобной лодке от поломки кода позже. Кстати, отличный ответ.
Джастин
20

Поскольку это появилось в поиске Google по запросу «javascript get number of digits», я хотел сказать, что есть более короткая альтернатива этому, которая полагается на внутреннее приведение, которое будет выполнено за вас:

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
streetlogics
источник
4
И быстрый jsperf показывает, что это НАМНОГО быстрее (например, в 10 раз или больше): jsperf.com/number-tostring-vs-number
Ledivin
НОТА! Считает точку тоже числом. (in dec_number)
Себастьян Норр
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

user40521
источник
1

Я все еще как бы изучаю Javascript, но некоторое время назад я придумал эту функцию на C, которая использует математику и цикл while, а не строку, поэтому я переписал ее для Javascript. Возможно, это можно было бы как-то сделать рекурсивно, но я до сих пор не совсем понял концепцию :( Это лучшее, что я мог придумать. Я не уверен, с какими большими числами он работает, это сработало, когда я поставил сотню цифры.

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

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

изменить: работает только с целочисленными значениями

Nate
источник
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 () jsfunction. Решение: мы могли бы сделать это через 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

где ЧИСЛО - это число, для которого требуется получить длину

AP
источник
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
Это не ответ на вопрос
Стив Тейлор