Ich möchte die Länge einer Zahl in JavaScript oder jQuery ermitteln.
Ich habe es value.length
ohne Erfolg versucht. Muss ich dies zuerst in einen String konvertieren?
Ich möchte die Länge einer Zahl in JavaScript oder jQuery ermitteln.
Ich habe es value.length
ohne Erfolg versucht. Muss ich dies zuerst in einen String konvertieren?
Antworten:
var x = 1234567;
x.toString().length;
Dieser Prozess wird auch für Float Number
und für Exponential number
auch funktionieren .
Ok, so viele Antworten, aber dies ist eine reine Mathematik, nur zum Spaß oder um sich daran zu erinnern, dass Mathematik wichtig ist:
var len = Math.ceil(Math.log(num + 1) / Math.LN10);
Dies gibt tatsächlich die "Länge" der Zahl an, selbst wenn sie in Exponentialform vorliegt. num
soll hier eine nicht negative ganze Zahl sein: Wenn es negativ ist, nimm seinen absoluten Wert und passe das Vorzeichen danach an.
Nun, das Math.log10
ist eine Sache , Sie können einfach schreiben
const len = Math.ceil(Math.log10(num + 1));
Math.ceil
und verwendet Math.abs
stattdessen ein schnelleres . Aber ich habe ehrlich gesagt nicht mit diesem Leistungszuwachs in Chrome gerechnet ... Gut zu wissen!
Ich habe diese Funktionalität in node.js verwendet. Dies ist meine bisher schnellste Implementierung:
var nLength = function(n) {
return (Math.log(Math.abs(n)+1) * 0.43429448190325176 | 0) + 1;
}
Es sollte positive und negative Ganzzahlen (auch in Exponentialform) verarbeiten und die Länge des Ganzzahlteils in Gleitkommazahlen zurückgeben.
Die folgende Referenz soll einen Einblick in die Methode geben: Weisstein, Eric W. "Number Length". Aus MathWorld - Eine Wolfram-Webressource.
Ich glaube, dass eine bitweise Operation die Math.abs ersetzen kann, aber jsperf zeigt, dass Math.abs in den meisten js-Engines einwandfrei funktioniert.
Update : Wie in den Kommentaren erwähnt, weist diese Lösung einige Probleme auf :(
Update2 (Problemumgehung) : Ich glaube, dass irgendwann Präzisionsprobleme auftreten und sich das Math.log(...)*0.434...
einfach unerwartet verhält. Wenn Internet Explorer oder mobile Geräte jedoch nicht Ihre Sache sind, können Sie diesen Vorgang durch die Math.log10
Funktion ersetzen . In Node.js habe ich einen kurzen Basistest mit der Funktion geschrieben nLength = (n) => 1 + Math.log10(Math.abs(n) + 1) | 0;
und Math.log10
damit wie erwartet funktioniert . Bitte beachten Sie, dass dies Math.log10
nicht allgemein unterstützt wird.
Nun, ohne die Ganzzahl in einen String umzuwandeln, könnten Sie eine funky Schleife erstellen:
var number = 20000;
var length = 0;
for(i = number; i > 1; ++i){
++length;
i = Math.floor(i/10);
}
alert(length);
.
als Teil der Berechnung berücksichtigt.
Konvertieren Sie es zuerst in einen String:
var mynumber = 123;
alert((""+mynumber).length);
Wenn Sie eine leere Zeichenfolge hinzufügen, wird dies implizit mynumber
zu einer Zeichenfolge.
Es gibt drei Möglichkeiten, dies zu tun.
var num = 123;
alert(num.toString().length);
bessere Leistung eins (beste Leistung in ie11)
var num = 123;
alert((num + '').length);
Mathe (beste Leistung in Chrome, Firefox, aber am langsamsten in IE11)
var num = 123
alert(Math.floor( Math.log(num) / Math.LN10 ) + 1)
Hier gibt es ein jspref http://jsperf.com/fastest-way-to-get-the-first-in-a-number/2
Sie sollten sich für die einfachste (stringLength) entscheiden, die Lesbarkeit übertrifft immer die Geschwindigkeit. Aber wenn Sie Wert auf Geschwindigkeit legen, finden Sie hier einige.
Drei verschiedene Methoden, alle mit unterschiedlicher Geschwindigkeit.
// 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);
}
In einem Test wurde mir eine ähnliche Frage gestellt.
Suchen Sie die Länge einer Zahl, ohne sie in eine Zeichenfolge umzuwandeln
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 ]
Negative Zahlen wurden hinzugefügt, um es etwas komplizierter zu machen, daher die Math.abs ().
Ich möchte die @ Neal-Antwort korrigieren, die für ganze Zahlen ziemlich gut war, aber die Zahl 1 würde im vorherigen Fall eine Länge von 0 zurückgeben.
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;
}