Chcę uzyskać długość liczby w JavaScript lub jQuery?
Próbowałem value.lengthbez powodzenia, czy muszę najpierw przekonwertować to na ciąg?
Chcę uzyskać długość liczby w JavaScript lub jQuery?
Próbowałem value.lengthbez powodzenia, czy muszę najpierw przekonwertować to na ciąg?
Odpowiedzi:
var x = 1234567;
x.toString().length;
Ten proces będzie również działał dla Float Numberi dla Exponential numberrównież.
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.
Teraz Math.log10to rzecz , możesz po prostu napisać
const len = Math.ceil(Math.log10(num + 1));
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ć!
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.
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);
.jako część obliczeń.
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.
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
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);
}
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 ().
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;
}