Jak mogę znaleźć długość liczby?

161

Chcę uzyskać długość liczby w JavaScript lub jQuery?

Próbowałem value.lengthbez powodzenia, czy muszę najpierw przekonwertować to na ciąg?

Code Junkie
źródło
3
Tak, zamień go na ciąg. Pojęcie „długości” liczby ma znaczenie tylko w odniesieniu do pewnego schematu reprezentacji liczb.
Pointy
Tak, musisz najpierw przekonwertować na ciąg, IE (1234) .toString (). Length
Osama Bari
Benchmarki dla 3 najpopularniejszych odpowiedzi: measurethat.net/Benchmarks/ShowResult/92276
Richie Bendall

Odpowiedzi:

304
var x = 1234567;

x.toString().length;

Ten proces będzie również działał dla Float Numberi dla Exponential numberrównież.

thecodeparadox
źródło
9
+1 od. W przypadku, gdy nie jest to dla nikogo oczywiste, przecinek dziesiętny w liczbach zmiennoprzecinkowych zostanie policzony do długości łańcucha. np. 2.5.toString (). długość danych wyjściowych 3.
dading84
1
@ dading84: domyślam się, że Math.floor () naprawiłoby to: Math.floor (99.5454) .toString (). length === 2
Manfred
7
To rozwiązanie nie zadziała w przypadku dużej liczby lub małej liczby, która ma więcej niż 20 cyfr. na przykład. 1.2e + 22 toString (). Długość wyjść 7
CherylG
Należy również zauważyć, że jest to bardzo powolne. Zrobiłem test w węźle i okazuje się, że jest o ponad 1200% wolniejszy niż odpowiedź Artura.
Oliver Dixon
1
Nie jest to dobre rozwiązanie, na przykład: const val = 0295; const x = val.toString (). length; console.log (x) // wyjście to: 3
karolkarp
82

Ok, tak wiele odpowiedzi, ale to jest czysta matematyka, tylko dla zabawy lub dla przypomnienia sobie, że matematyka jest ważna:

var len = Math.ceil(Math.log(num + 1) / Math.LN10);

To faktycznie daje „długość” liczby, nawet jeśli ma ona postać wykładniczą. numma być tutaj nieujemną liczbą całkowitą: jeśli jest ujemna, weź jego wartość bezwzględną, a następnie dostosuj znak.

Aktualizacja dla ES2015

Teraz Math.log10to rzecz , możesz po prostu napisać

const len = Math.ceil(Math.log10(num + 1));
MaxArt
źródło
1
Myślę, że ta czysta matematyka jest najbardziej wydajna / najszybsza.
Noitidart
2
Awesme perf man, dzięki. Wyniki, które otrzymałem, pokazują, że matematyka jest szybka. Czy to jest wynik, który otrzymałeś? Oto mój wynik: i.imgur.com/9BKxyd3.png
Noitidart
1
@HubertGrzeskowiak Och, to miło. Widzę, że ta metoda jest w zasadzie metodą matematyczną, ale z niektórymi hackami prędkości. Upuszcza Math.ceili Math.abszamiast tego używa szybszego . Ale szczerze mówiąc, nie spodziewałem się takiego wzrostu wydajności w Chrome ... Dobrze wiedzieć!
MaxArt,
3
Idealnie, ale daje 0, jeśli liczba wynosi 0 zamiast 1
StateLess
1
Przy 1e + 16 lub więcej daje 1 mniej, więc 10000000000000000 zwraca 16 zamiast 17 i tak dalej ...
Goty Metal
12

Korzystałem z tej funkcjonalności w node.js, to jest moja najszybsza jak dotąd implementacja:

var nLength = function(n) { 
    return (Math.log(Math.abs(n)+1) * 0.43429448190325176 | 0) + 1; 
}

Powinien obsługiwać dodatnie i ujemne liczby całkowite (również w postaci wykładniczej) i powinien zwracać długość części całkowitej w liczbach zmiennoprzecinkowych.

Poniższe odniesienie powinno dostarczyć pewnego wglądu w metodę: Weisstein, Eric W. „Długość liczby”. Z MathWorld - Zasób sieciowy Wolfram.

Uważam, że jakaś operacja bitowa może zastąpić Math.abs, ale jsperf pokazuje, że Math.abs działa dobrze w większości silników js.

Aktualizacja : jak zauważono w komentarzach, to rozwiązanie ma pewne problemy :(

Aktualizacja2 (obejście) : Uważam, że w pewnym momencie pojawiają się problemy z precyzją i po Math.log(...)*0.434...prostu zachowuje się nieoczekiwanie. Jeśli jednak Internet Explorer lub urządzenia mobilne nie są twoją filiżanką herbaty, możesz zastąpić tę operację Math.log10funkcją. W Node.js napisałem szybki podstawowy test z funkcją nLength = (n) => 1 + Math.log10(Math.abs(n) + 1) | 0;i Math.log10działał zgodnie z oczekiwaniami. Należy pamiętać, że Math.log10nie jest to powszechnie obsługiwane.

Israfil Havilah
źródło
Jako ciekawostka wykonałem JsPerf metodą nLength w porównaniu z toString (). Length na tym .... jsperf.com/convert-number-to-string-and-get-length/2
Havilah
Haha, to w zasadzie rozwiązanie, które dostarczyłem! Nie miałem pojęcia, że ​​może tak dobrze działać.
MaxArt
2
Przepraszam, czy powiedziałem coś o tym, że wymyślałem rozwiązanie, czy coś takiego? Dlaczego nie przeczytasz uważnie przed wysłaniem? A propos, algorytm został odkryty na długo przed narodzinami Stevena Wolframa, a poza tym strona, do której się odnosiłeś, nie zapewnia rozwiązania w Javascript. Zrobiłem to 9 miesięcy przed tobą.
MaxArt
1
"+1" prawdopodobnie powinno znajdować się poza wywołaniem Math.abs: Math.log (Math.abs (n) + 1) ...
Hubert Grzeskowiak
1
Przy 1e + 16 lub więcej daje 1 mniej, więc 10000000000000000 zwraca 16 zamiast 17 i tak dalej ...
Goty Metal
11

Aby uzyskać długość, musisz przekształcić liczbę w ciąg

var num = 123;

alert((num + "").length);

lub

alert(num.toString().length);
Adil
źródło
9

Można również użyć ciągu szablonu:

const num = 123456
`${num}`.length // 6
funador
źródło
to jedyna odpowiedź, która mi
pasuje,
5

Cóż, bez zamiany liczby całkowitej na łańcuch, możesz stworzyć funkową pętlę:

var number = 20000;
var length = 0;
for(i = number; i > 1; ++i){
     ++length;
     i = Math.floor(i/10);
}

alert(length);​

Demo: http://jsfiddle.net/maniator/G8tQE/

Naftali alias Neal
źródło
3
@Pointy tak, to zakłada liczbę całkowitą. Nawet jeśli utworzysz ciąg znaków, uwzględni on .jako część obliczeń.
Naftali aka Neal
tak, chociaż jest to interesujące pytanie filozoficzne, czy kropka powinna być uwzględniona w "długości" :-)
Pointy
4

Najpierw przekonwertuj go na ciąg:

var mynumber = 123;
alert((""+mynumber).length);

Dodanie do niego pustego ciągu niejawnie spowoduje mynumberprzekształcenie się w łańcuch.

tskuzzy
źródło
1
Nie działa z wykładnikami, takimi jak 1e + 16, które zwracają 5.
Goty Metal
4

Można to zrobić na trzy sposoby.

var num = 123;
alert(num.toString().length);

lepsza wydajność (najlepsza wydajność w ie11)

var num = 123;
alert((num + '').length);

Matematyka (najlepsza wydajność w Chrome, Firefox, ale najwolniejsza w IE11)

var num = 123
alert(Math.floor( Math.log(num) / Math.LN10 ) + 1)

jest tutaj jspref http://jsperf.com/fastest-way-to-get-the-first-in-a-number/2

Eric Chen
źródło
4

Powinieneś wybrać najprostszy (stringLength), czytelność zawsze przewyższa szybkość. Ale jeśli zależy Ci na szybkości, poniżej znajdziesz kilka.

Trzy różne metody z różną szybkością.

// 34ms
let weissteinLength = function(n) { 
    return (Math.log(Math.abs(n)+1) * 0.43429448190325176 | 0) + 1;
}

// 350ms
let stringLength = function(n) {
    return n.toString().length;
}

// 58ms
let mathLength = function(n) {
    return Math.ceil(Math.log(n + 1) / Math.LN10);
}

// Simple tests below if you care about performance.

let iterations = 1000000;
let maxSize = 10000;

// ------ Weisstein length.

console.log("Starting weissteinLength length.");
let startTime = Date.now();

for (let index = 0; index < iterations; index++) {
    weissteinLength(Math.random() * maxSize);
}

console.log("Ended weissteinLength length. Took : " + (Date.now() - startTime ) + "ms");


// ------- String length slowest.

console.log("Starting string length.");
startTime = Date.now();

for (let index = 0; index < iterations; index++) {
    stringLength(Math.random() * maxSize);
}

console.log("Ended string length. Took : " + (Date.now() - startTime ) + "ms");


// ------- Math length.

console.log("Starting math length.");
startTime = Date.now();

for (let index = 0; index < iterations; index++) {
    mathLength(Math.random() * maxSize);
}
Oliver Dixon
źródło
3

W teście zadano mi podobne pytanie.

Znajdź długość liczby bez konwersji na ciąg

const numbers = [1, 10, 100, 12, 123, -1, -10, -100, -12, -123, 0, -0]

const numberLength = number => {

  let length = 0
  let n = Math.abs(number)

  do {
    n /=  10
    length++
  } while (n >= 1)

  return length
}

console.log(numbers.map(numberLength)) // [ 1, 2, 3, 2, 3, 1, 2, 3, 2, 3, 1, 1 ]

Liczby ujemne zostały dodane, aby trochę bardziej to skomplikować, stąd Math.abs ().

Adrian Lynch
źródło
2

Chciałbym poprawić odpowiedź @Neal, która była całkiem dobra dla liczb całkowitych, ale liczba 1 zwróciłaby długość 0 w poprzednim przypadku.

function Longueur(numberlen)
{
    var length = 0, i; //define `i` with `var` as not to clutter the global scope
    numberlen = parseInt(numberlen);
    for(i = numberlen; i >= 1; i)
    {
        ++length;
        i = Math.floor(i/10);
    }
    return length;
}
Gregzenegair
źródło
0

Spróbuj tego:

$("#element").text().length;

Przykład użycia

Matthew Riches
źródło
0

Tak, aby znaleźć długość, musisz przekonwertować na ciąg znaków, na przykład

var x=100;// type of x is number
var x=100+"";// now the type of x is string
document.write(x.length);//which would output 3.
kamal
źródło