Holen Sie sich die Anzahl der Stellen mit JavaScript

124

Wie der Titel meines Beitrags andeutet, möchte ich wissen, wie viele Ziffern es var numbergibt. Zum Beispiel: Wenn number = 15;meine Funktion zurückkehren soll 2. Derzeit sieht es so aus:

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

Aber Safari sagt, dass es nicht funktioniert, weil TypeError:

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

Wie Sie sehen, '2'ist eigentlich die richtige Lösung. Aber warum ist es so not a function?

bit4fox
quelle

Antworten:

229

lengthist eine Eigenschaft, keine Methode. Sie können es nicht nennen, daher benötigen Sie keine Klammern ():

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

UPDATE: Wie in den Kommentaren erläutert, funktioniert das obige Beispiel nicht für Float-Nummern. Damit es funktioniert, können wir entweder einen Punkt mit String(number).replace('.', '').lengthentfernen oder die Ziffern mit regulären Ausdrücken zählen : String(number).match(/\d/g).length.

In Bezug auf die Geschwindigkeit ist es möglicherweise der mathematisch schnellste Weg, die Anzahl der Stellen in der angegebenen Anzahl zu ermitteln. Für positive ganze Zahlen gibt es einen wunderbaren Algorithmus mit log10:

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

Für alle Arten von Ganzzahlen (einschließlich Negative) gibt es eine brillant optimierte Lösung von @ Mwr247. Seien Sie jedoch vorsichtig bei der Verwendung Math.log10, da diese von vielen älteren Browsern nicht unterstützt wird. Durch Ersetzen Math.log10(x)durch Math.log(x) * Math.LOG10Ewird das Kompatibilitätsproblem gelöst.

Das Erstellen schneller mathematischer Lösungen für Dezimalzahlen ist aufgrund des bekannten Verhaltens der Gleitkomma-Mathematik nicht einfach , sodass der Cast-to-String-Ansatz einfacher und narrensicherer ist. Wie von @streetlogics erwähnt, kann schnelles Casting mit einer einfachen Verkettung von Zahlen zu Zeichenfolgen durchgeführt werden. Dies führt dazu , dass die Ersetzungslösung in Folgendes umgewandelt wird:

var length = (number + '').replace('.', '').length;  // for floats
Vision
quelle
3
Gute Technik, um keine Ziffer zu erhalten, aber was ist, wenn es sich um eine Bruchzahl handelt, dh 12,5, dann gibt Ihre Funktion 4 statt 3 zurück ...
Swarnendu Paul
@Swarnendu: Das ist kein Problem, weil ich nur ganze Zahlen habe.
Bit4Fox
3
Ansonsten benutze einfach so etwas number.toString().match(/\d/g).length.
VisioN
1
@ Bakudan - Diese Antwort scheint behoben worden zu sein. Sie können Ihre zwei Kommentare löschen, die es jetzt kritisieren (damit zukünftige Leute nicht verwirrt werden und denken, dass der Code in dieser Antwort nicht funktioniert.)
ArtOfWarfare
1
@ 3ocene Gute Vermutung! Der Wert bleibt gleich, wird jedoch hinter den Kulissen in eine Ganzzahl umgewandelt. x | 0ist nur eine weitere kurze und schnelle Version von Math.floor(x), die die Zahl abrundet. Sie können das gleiche mit erreichen ~~x. Die folgende Frage enthält weitere Erläuterungen zu diesem Punkt: stackoverflow.com/q/9049677/1249581 .
VisioN
65

Hier ist eine mathematische Antwort (funktioniert auch für negative Zahlen):

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

Und eine optimierte Version der oben genannten (effizientere bitweise Operationen):

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

Im Wesentlichen beginnen wir damit, den absoluten Wert der Eingabe zu ermitteln, damit negative Werte korrekt funktionieren. Dann führen wir die log10-Operation durch, um uns die Potenz von 10 der Eingabe zu geben (wenn Sie in einer anderen Basis arbeiten würden, würden Sie den Logarithmus für diese Basis verwenden), dh die Anzahl der Stellen. Dann setzen wir die Ausgabe auf den Boden, um nur den ganzzahligen Teil davon zu erfassen. Schließlich verwenden wir die Funktion max, um Dezimalwerte festzulegen (jeder Bruchwert zwischen 0 und 1 gibt nur 1 anstelle einer negativen Zahl zurück) und addieren 1 zur endgültigen Ausgabe, um die Anzahl zu erhalten.

Das Obige setzt voraus (basierend auf Ihrer Beispieleingabe), dass Sie die Anzahl der Ziffern in ganzen Zahlen zählen möchten (also 12345 = 5 und damit auch 12345.678 = 5). Wenn Sie die Gesamtzahl der Stellen im Wert zählen möchten (also 12345.678 = 8), fügen Sie diese vor der 'Rückgabe' in einer der obigen Funktionen hinzu:

x = Number(String(x).replace(/[^0-9]/g, ''));
Mwr247
quelle
3
Hinweis: Math.log10 ist die ES6-Funktion developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Tx3
2
@ Tx3 Gute Notiz! Zum Glück Math.LOG10Egibt es seit ES1, was bedeutet Math.log(x) * Math.LOG10E, dass die Kompatibilität gewährleistet ist.
Mwr247
Ich denke, diese Funktion funktioniert nicht: `` `Funktion numDigits (x) {return (Math.log10 ((x ^ (x >> 31)) - (x >> 31)) | 0) + 1; } `` `numDigits (1234567891) -> 10 numDigits (12345678912) -> 9
lokhmakov
@lokhmakov Das liegt daran, dass die zweite Zahl, die Sie angegeben haben, den maximalen 32-Bit-Integer-Wert von JavaScript überschreitet, den bitweise Operatoren (^, ​​>>, |) nicht richtig verarbeiten können.
Mwr247
1
Wahr. Man sollte erwarten, dass JS nur mit dem max safe int funktioniert und diese Zahl viel größer ist, als fast jeder für irgendetwas benötigen würde. Ich entwickle ein Spiel mit sehr großen Zahlen und konnte den optimierten Code aufgrund dieser Einschränkung nicht verwenden. Ich dachte, ich würde einen Kommentar abgeben, um zu verhindern, dass später jemand in einem ähnlichen Boot den Code kaputt macht. Tolle Antwort übrigens.
Justin
20

Da dies bei einer Google-Suche nach "Javascript Get Number of Digits" auftauchte, wollte ich darauf hinweisen, dass es eine kürzere Alternative dazu gibt, die auf internem Casting für Sie beruht:

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

Erträge

3 4
Straßenlogik
quelle
4
Und ein kurzer jsperf zeigt, dass dies auch VIEL schneller ist (wie in, 10x oder mehr): jsperf.com/number-tostring-vs-number
Ledivin
HINWEIS! Zählt den Punkt auch als Zahl. (in dec_number)
Sebastian Norr
2

Wenn Sie Ziffern benötigen (nach dem Trennzeichen), können Sie einfach den zweiten Teil (nach dem Punkt) teilen und die Länge zählen.

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

Ich lerne immer noch Javascript, aber ich habe diese Funktion vor einiger Zeit in C entwickelt, die Mathe und eine while-Schleife anstelle eines Strings verwendet, also habe ich sie für Javascript neu geschrieben. Vielleicht könnte dies irgendwie rekursiv gemacht werden, aber ich habe das Konzept immer noch nicht wirklich verstanden :( Dies ist das Beste, was ich mir einfallen lassen kann. Ich bin mir nicht sicher, mit wie vielen Zahlen es funktioniert, es hat funktioniert, als ich hundert eingegeben habe Ziffern.

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

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

Bearbeiten: Funktioniert nur mit ganzzahligen Werten

Nate
quelle
1

Hinweis: Diese Funktion wird ignoriert die Zahlen nach dem Komma mittleren Punkt , wenn Sie mit dezimal zählen Wanna dann entfernen Math.floor(). Direkt zum Punkt check this out!

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

Grundsätzlich, was hier los ist. toString()und String()dieselbe integrierte Funktion zum Konvertieren von Ziffern in Zeichenfolgen. Sobald wir konvertiert haben, ermitteln wir die Länge der Zeichenfolge anhand der integrierten Funktionlength .

Warnung: Aber diese Funktion würde bei negativen Zahlen nicht richtig funktionieren. Wenn Sie versuchen, mit negativen Zahlen zu spielen, überprüfen Sie diese Antwort oder setzen Sie sie einfachMath.abs() .

Cheer You!

Code
quelle
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
quelle
0

Zwei Ziffern: einfache Funktion für den Fall, dass Sie mit ECMAScript 6 (ES6) zwei oder mehr Ziffern einer Zahl benötigen:

const zeroDigit = num => num.toString().length === 1 ? `0${num}` : num;
Rafael Melón
quelle
0

Problemstellung: Anzahl / Zeichenfolge ohne Verwendung der Funktion string.length () zählen. Lösung: Wir könnten dies über den Forloop tun. z.B

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

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

else{
  this.number = this.y;
}    

}}

Yogesh Aggarwal
quelle
0

Hier ist meine Lösung. Es funktioniert mit positiven und negativen Zahlen. Hoffe das hilft

function findDigitAmount(num) {

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

 return lengthNumber.length;
}


(findDigitAmount(-96456431);    // 8
(findDigitAmount(1524):         // 4
Juliana Melo
quelle
0

es wäre einfach, die Länge als zu bekommen

  `${NUM}`.length

Dabei ist NUM die Nummer, für die die Länge ermittelt werden soll

AP
quelle
0

Sie können in diesem Trick verwenden

(''+number).length

Idan
quelle
0

Bitte verwenden Sie den folgenden Ausdruck, um die Länge der Nummer zu ermitteln.

length = variableName.toString().length
Priya Shalini
quelle
-7

Die length-Eigenschaft gibt die Länge einer Zeichenfolge (Anzahl der Zeichen) zurück.

Die Länge einer leeren Zeichenfolge beträgt 0.

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

Das Ergebnis von n ist: 12

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

Das Ergebnis von n ist: 0


Arraylänge Eigenschaft:


Die Eigenschaft length legt die Anzahl der Elemente in einem Array fest oder gibt diese zurück.

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

Das Ergebnis ist: 4

Syntax:

Geben Sie die Länge eines Arrays zurück:

array.length

Legen Sie die Länge eines Arrays fest:

array.length=number
Muhammad Awais
quelle
2
Dies beantwortet nicht die Frage
Steve Taylor