Wie finde ich die Länge einer Zahl?

161

Ich möchte die Länge einer Zahl in JavaScript oder jQuery ermitteln.

Ich habe es value.lengthohne Erfolg versucht. Muss ich dies zuerst in einen String konvertieren?

Code Junkie
quelle
3
Ja, konvertieren Sie es in eine Zeichenfolge. Das Konzept der "Länge" einer Zahl ist nur in Bezug auf ein Zahlendarstellungsschema von Bedeutung.
Pointy
Ja, Sie müssen zuerst in die Zeichenfolge konvertieren, IE (1234) .toString (). Länge
Osama Bari
Benchmarks für die Top 3 Antworten: messethat.net/Benchmarks/ShowResult/92276
Richie Bendall

Antworten:

304
var x = 1234567;

x.toString().length;

Dieser Prozess wird auch für Float Numberund für Exponential numberauch funktionieren .

thecodeparadox
quelle
9
+ 1'd. Falls es für niemanden offensichtlich ist, wird der Dezimalpunkt in Gleitkommazahlen in der Zeichenfolgenlänge gezählt. zB 2.5.toString (). Längenausgänge 3.
dading84
1
@ dading84: Ich denke, Math.floor () würde das beheben: Math.floor (99.5454) .toString (). Länge === 2
Manfred
7
Diese Lösung funktioniert nicht mit großen oder kleinen Zahlen mit mehr als 20 Stellen. z.B. 1.2e + 22 toString (). Länge gibt 7 aus
CherylG
Auch zu beachten ist dies extrem langsam. Ich habe einen Test im Knoten durchgeführt und es stellte sich heraus, dass er mehr als 1200% langsamer ist als die Antwort von Arturs.
Oliver Dixon
1
Es ist keine gute Lösung, Beispiel: const val = 0295; const x = val.toString (). length; console.log (x) // Ausgabe ist: 3
karolkarp
82

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. numsoll hier eine nicht negative ganze Zahl sein: Wenn es negativ ist, nimm seinen absoluten Wert und passe das Vorzeichen danach an.

Update für ES2015

Nun, das Math.log10ist eine Sache , Sie können einfach schreiben

const len = Math.ceil(Math.log10(num + 1));
MaxArt
quelle
1
Ich denke, diese reine Mathematik ist am effizientesten / schnellsten.
Noitidart
2
Awesme perf man danke. Die Ergebnisse, die ich erhalten habe, zeigen, dass der mathematische Weg schnell ist. Ist dies das Ergebnis, das Sie erhalten haben? Hier ist mein Ergebnis: i.imgur.com/9BKxyd3.png
Noitidart
1
@ HubertGrzeskowiak Oh das ist schön. Ich sehe, dass diese Methode im Grunde genommen sowieso eine mathematische ist, aber mit einigen Speed-Hacks. Es lässt ein fallen Math.ceilund verwendet Math.absstattdessen ein schnelleres . Aber ich habe ehrlich gesagt nicht mit diesem Leistungszuwachs in Chrome gerechnet ... Gut zu wissen!
MaxArt
3
Perfekt, aber gibt 0, wenn deine Zahl 0 statt 1 ist
StateLess
1
Bei 1e + 16 oder mehr gibt es 1 weniger, also gibt 10000000000000000 16 statt 17 zurück und so weiter ...
Goty Metal
12

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.log10Funktion 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.log10damit wie erwartet funktioniert . Bitte beachten Sie, dass dies Math.log10nicht allgemein unterstützt wird.

Israfil Havilah
quelle
Als Neugier Ich habe ein JsPerf mit nLength Methode vs toString ausgeführt () Länge auf diesem ..... Jsperf.com/convert-number-to-string-and-get-length/2
Israfil Hevila
Haha, das ist im Grunde die Lösung, die ich bereitgestellt habe! Ich hatte keine Ahnung, dass es so gut funktionieren könnte.
MaxArt
2
Es tut mir leid, habe ich etwas darüber gesagt, dass ich die Lösung erfunden habe oder so? Warum liest du vor dem Posten nicht sorgfältig? Für die Angelegenheit wurde die algorhythm Weg entdeckt , bevor Steven Wolfram selbst geboren wurde, und trotzdem die Seite , die Sie verknüpft ist nicht eine Lösung in Javascript bieten. Ich habe es getan, 9 Monate vor dir.
MaxArt
1
Die "+1" sollte wahrscheinlich außerhalb des Math.abs-Aufrufs liegen: Math.log (Math.abs (n) + 1) ...
Hubert Grzeskowiak
1
Bei 1e + 16 oder mehr gibt es 1 weniger, also gibt 10000000000000000 16 statt 17 zurück und so weiter ...
Goty Metal
11

Sie müssen die Nummer in die Zeichenfolge eingeben, um die Länge zu bestimmen

var num = 123;

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

oder

alert(num.toString().length);
Adil
quelle
9

Könnte auch eine Vorlagenzeichenfolge verwenden:

const num = 123456
`${num}`.length // 6
Funador
quelle
Dies ist die einzige Antwort, die für mich funktioniert, da ich eine Zahl zähle, die mit 0 beginnt.
jessiPP
5

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

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

Naftali alias Neal
quelle
3
@Pointy ja, ist dies unter der Annahme , eine ganze Zahl. Selbst wenn Sie eine Zeichenfolge erstellen, wird diese .als Teil der Berechnung berücksichtigt.
Naftali aka Neal
ja, obwohl es eine interessante philosophische Frage ist, ob der Punkt in die "Länge" aufgenommen werden soll :-)
Pointy
4

Konvertieren Sie es zuerst in einen String:

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

Wenn Sie eine leere Zeichenfolge hinzufügen, wird dies implizit mynumberzu einer Zeichenfolge.

tskuzzy
quelle
1
Funktioniert nicht mit Exponentialen wie 1e + 16, die 5 zurückgeben.
Goty Metal
4

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

Eric Chen
quelle
4

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);
}
Oliver Dixon
quelle
3

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

Adrian Lynch
quelle
2

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;
}
Gregzenegair
quelle
0

Ja, Sie müssen in einen String konvertieren, um die Länge zu ermitteln. Zum Beispiel

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
quelle