Uzyskaj liczbę cyfr za pomocą JavaScript

124

Jak sugeruje tytuł mojego wpisu, chciałbym wiedzieć, ile var numberma cyfr . Na przykład: Jeśli number = 15;moja funkcja powinna zwrócić 2. Obecnie wygląda to tak:

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

Ale Safari twierdzi, że nie działa z powodu TypeError:

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

Jak widać, '2'to właściwie właściwe rozwiązanie. Ale dlaczego tak jest not a function?

bit4fox
źródło

Odpowiedzi:

229

lengthjest właściwością, a nie metodą. Nie możesz tego nazwać, więc nie potrzebujesz nawiasów ():

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

AKTUALIZACJA: Jak omówiono w komentarzach, powyższy przykład nie będzie działał dla liczb zmiennoprzecinkowych. Aby uczynić go pracy możemy albo pozbyć okres z String(number).replace('.', '').length, lub liczyć cyfry z wyrażenia regularnego: String(number).match(/\d/g).length.

Pod względem szybkości, potencjalnie najszybszym sposobem uzyskania liczby cyfr w podanej liczbie jest zrobienie tego matematycznie. Dla dodatnich liczb całkowitych istnieje wspaniały algorytm z log10:

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

Dla wszystkich typów liczb całkowitych (w tym ujemnych) istnieje doskonałe, zoptymalizowane rozwiązanie od @ Mwr247 , ale należy zachować ostrożność Math.log10, ponieważ nie jest obsługiwane przez wiele starszych przeglądarek. Więc wymianie Math.log10(x)z Math.log(x) * Math.LOG10Erozwiąże problem ze zgodnością.

Tworzenie szybkich rozwiązań matematycznych dla liczb dziesiętnych nie będzie łatwe ze względu na dobrze znane zachowanie matematyki zmiennoprzecinkowej , więc podejście rzutowania na łańcuch będzie łatwiejsze i bardziej głupie. Jak wspomniano przez @streetlogics szybko odlewania można zrobić z prostego liczby na ciąg konkatenacji, prowadząc zastąpi rozwiązanie zostać przekształcone do:

var length = (number + '').replace('.', '').length;  // for floats
Wizja
źródło
3
dobra technika, aby uzyskać liczbę cyfr, ale co jeśli jest to liczba ułamkowa, tj. 12,5, to twoja funkcja zwróci 4 zamiast 3 ...
Swarnendu Paul
@Swarnendu: Nie ma problemu, ponieważ mam tylko liczby całkowite.
bit4fox
3
W przeciwnym razie użyj czegoś takiego jak number.toString().match(/\d/g).length.
VisioN,
1
@Bakudan - wydaje się, że ta odpowiedź została naprawiona. Możesz usunąć swoje dwa komentarze krytykując je teraz (aby przyszli ludzie nie byli zdezorientowani i myśleli, że kod w tej odpowiedzi nie działa.)
ArtOfWarfare
1
@ 3ocene Dobre przypuszczenie! Wartość pozostaje taka sama, ale za sceną jest rzutowana na liczbę całkowitą. x | 0to kolejna krótka i szybka wersja programu Math.floor(x), która zaokrągla liczbę w dół. Możesz osiągnąć to samo dzięki ~~x. Więcej wyjaśnień na ten temat zawiera następujące pytanie: stackoverflow.com/q/9049677/1249581 .
VisioN
66

Oto odpowiedź matematyczna (działa również dla liczb ujemnych):

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

I zoptymalizowana wersja powyższego (bardziej wydajne operacje bitowe):

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

Zasadniczo zaczynamy od uzyskania wartości bezwzględnej danych wejściowych, aby umożliwić poprawne działanie wartości ujemnych. Następnie przeprowadzamy operację log10, aby określić, jaka potęga 10 jest na wejściu (jeśli pracujesz w innej bazie, użyłbyś logarytmu dla tej podstawy), czyli liczby cyfr. Następnie ustawiamy wartość wyjściową, aby pobrać tylko część całkowitą. Na koniec używamy funkcji max do ustalania wartości dziesiętnych (każda wartość ułamkowa między 0 a 1 zwraca tylko 1 zamiast liczby ujemnej) i dodajemy 1 do końcowego wyniku, aby uzyskać liczbę.

Powyższe zakłada (na podstawie przykładowych danych wejściowych), że chcesz policzyć liczbę cyfr w liczbach całkowitych (więc 12345 = 5, a zatem również 12345.678 = 5). Jeśli chcesz policzyć całkowitą liczbę cyfr w wartości (czyli 12345,678 = 8), dodaj to przed „zwrotem” w którejkolwiek z powyższych funkcji:

x = Number(String(x).replace(/[^0-9]/g, ''));
Mwr247
źródło
3
Uwaga: Math.log10 to programista
ES6.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ...
2
@ Tx3 Dobra uwaga! Na szczęście Math.LOG10Eistnieje od wersji ES1, co oznacza, że Math.log(x) * Math.LOG10Ebędzie działać pod kątem kompatybilności.
Mwr247
Myślę, że ta funkcja nie działa: `` function numDigits (x) {return (Math.log10 ((x ^ (x >> 31)) - (x >> 31)) | 0) + 1; } `` numDigits (1234567891) -> 10 numDigits (12345678912) -> 9
lokhmakov
@lokhmakov Dzieje się tak, ponieważ druga podana liczba przekracza maksymalną 32-bitową wartość całkowitą JavaScript, której operatory bitowe (^, >>, |) nie obsługują poprawnie.
Mwr247
1
Prawdziwe. Należy się spodziewać, że JS działa tylko z max safe int, a ta liczba jest znacznie większa niż prawie ktokolwiek potrzebowałby do czegokolwiek. Tworzę grę z bardzo dużymi liczbami i nie mogłem użyć zoptymalizowanego kodu z powodu tego ograniczenia, i pomyślałem, że skomentuję, aby uratować każdego innego na podobnej łodzi przed uszkodzeniem kodu w późniejszym czasie. Swoją drogą świetna odpowiedź.
Justin
20

Ponieważ pojawiło się to w wyszukiwarce Google dla „javascript pobierz liczbę cyfr”, chciałem rzucić tam, że istnieje krótsza alternatywa dla tego, która polega na wewnętrznym przesyłaniu, które można wykonać za Ciebie:

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

Plony

3 4
streetlogics
źródło
4
A szybki jsperf pokazuje, że jest to DUŻO szybsze (jak w, 10x lub więcej): jsperf.com/number-tostring-vs-number
Ledivin
UWAGA! Kropkę też liczy jako liczbę. (w dec_number)
Sebastian Norr
2

Jeśli potrzebujesz cyfr (po separatorze), możesz po prostu podzielić liczbę i policzyć długość drugiej części (po punkcie).

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

Wciąż uczę się Javascript, ale jakiś czas temu wymyśliłem tę funkcję w C, która używa matematyki i pętli while zamiast ciągu znaków, więc ponownie napisałem ją dla Javascript. Może dałoby się to jakoś rekurencyjnie zrobić, ale nadal nie do końca zrozumiałem koncepcję :( To najlepsze, co mogłem wymyślić. Nie jestem pewien, z jak dużą liczbą liczb to działa, zadziałało, gdy wstawię sto cyfry.

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

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

edit: działa tylko z wartościami całkowitymi

Nate
źródło
1

Uwaga: Ta funkcja będzie ignorować liczb po przecinku średniej kropką , Jeśli chce liczyć z przecinku następnie usunąć Math.floor(). Sprawdź to bezpośrednio!

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

Zasadniczo, co się tutaj dzieje. toString()i ta String()sama funkcja wbudowana do konwersji cyfry na łańcuch, po przekonwertowaniu znajdziemy długość ciągu za pomocą funkcji wbudowanej length.

Uwaga: Ale ta funkcja nie działałaby poprawnie dla liczby ujemnej, jeśli próbujesz grać z liczbą ujemną, sprawdź tę odpowiedź Lub po prostu ją wstaw Math.abs();

Wspieram cię!

Kod
źródło
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
źródło
0

Dwie cyfry: prosta funkcja w przypadku, gdy potrzebujesz dwóch lub więcej cyfr numeru z ECMAScript 6 (ES6):

const zeroDigit = num => num.toString().length === 1 ? `0${num}` : num;
Rafael Melón
źródło
0

Instrukcja problemu: Policz liczbę / ciąg bez funkcji string.length () js. Rozwiązanie: moglibyśmy to zrobić przez Forloop. na przykład

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

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

else{
  this.number = this.y;
}    

}

Yogesh Aggarwal
źródło
0

Oto moje rozwiązanie. Działa z liczbami dodatnimi i ujemnymi. Mam nadzieję że to pomoże

function findDigitAmount(num) {

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

 return lengthNumber.length;
}


(findDigitAmount(-96456431);    // 8
(findDigitAmount(1524):         // 4
Juliana Melo
źródło
0

byłoby łatwo uzyskać długość jako

  `${NUM}`.length

gdzie NUM to liczba, dla której należy uzyskać długość

AP
źródło
0

Możesz użyć w tej sztuczce

(''+number).length

Idan
źródło
0

Aby uzyskać długość numeru, użyj następującego wyrażenia.

length = variableName.toString().length
Priya Shalini
źródło
-7

Właściwość length zwraca długość łańcucha (liczbę znaków).

Długość pustego ciągu wynosi 0.

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

Wynik n będzie: 12

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

Wynik n będzie: 0


Właściwość długości tablicy:


Właściwość length ustawia lub zwraca liczbę elementów w tablicy.

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

Rezultatem będzie: 4

Składnia:

Zwróć długość tablicy:

array.length

Ustaw długość tablicy:

array.length=number
Muhammad Awais
źródło
2
To nie odpowiada na pytanie
Steve Taylor