Aantal cijfers ophalen met JavaScript

Zoals de titel van mijn bericht suggereert, zou ik graag willen weten hoeveel cijfers var numberheeft. Bijvoorbeeld: Als number = 15;moet mijn functie 2teruggeven. Momenteel ziet het er zo uit:

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

Maar Safari zegt dat het niet werkt vanwege een TypeError:

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

Zoals je kunt zien, is '2'eigenlijk de juiste oplossing. Maar waarom is het not a function?


Antwoord 1, autoriteit 100%

lengthis een eigenschap, geen methode. Je kunt het niet noemen, daarom heb je geen haakjes nodig ():

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

UPDATE:Zoals besproken in de opmerkingen, werkt het bovenstaande voorbeeld niet voor float-nummers. Om het te laten werken kunnen we ofwel een punt verwijderen met String(number).replace('.', '').length, of de cijfers tellen met reguliere expressie: String(number).match(/\d/g).length.

In termen van snelheid is de snelste manier om het aantal cijfers in het gegeven getal te krijgen, om het wiskundig te doen. Voor positieve gehele getallenis er een prachtig algoritme met log10:

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

Voor alle typen gehele getallen (inclusief negatieven) is er een briljante geoptimaliseerde oplossing van @Mwr247, maar wees voorzichtig met met behulp van Math.log10, omdat het niet door veel oudere browsers wordt ondersteund. Dus het vervangen van Math.log10(x)door Math.log(x) * Math.LOG10Elost het compatibiliteitsprobleem op.

Het maken van snelle wiskundige oplossingen voor decimale getallen zal niet eenvoudig zijn vanwege het bekende gedrag van drijvende-komma-wiskunde, dus cast-to-string benadering zal gemakkelijker en onfeilbaarder zijn. Zoals vermeld door @streetlogicskan snel casten worden gedaan met een eenvoudige aaneenschakeling van getallen naar string, waardoor de replaceoplossing om te zetten in:

var length = (number + '').replace('.', '').length;  // for floats

Antwoord 2, autoriteit 28%

Hier is een wiskundig antwoord (werkt ook voor negatieve getallen):

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

En een geoptimaliseerde versie van het bovenstaande (efficiëntere bitsgewijze bewerkingen): *

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

In wezen beginnen we met het verkrijgen van de absolute waarde van de invoer om negatieve waarden correct te laten werken. Vervolgens doorlopen we de log10-bewerking om ons te geven welke macht van 10 de invoer is (als u in een andere basis zou werken, zou u de logaritme voor die basis gebruiken), wat het aantal cijfers is. Vervolgens verlagen we de uitvoer om alleen het gehele deel daarvan te pakken. Ten slotte gebruiken we de max-functie om decimale waarden vast te stellen (elke fractionele waarde tussen 0 en 1 geeft gewoon 1, in plaats van een negatief getal) en voegt 1 toe aan de uiteindelijke uitvoer om de telling te krijgen.

Bij het bovenstaande wordt ervan uitgegaan (op basis van uw voorbeeldinvoer) dat u het aantal cijfers in gehele getallen wilt tellen (dus 12345 = 5, en dus ook 12345.678 = 5). Als je het totale aantal cijfers in de waarde wilt tellen (dus 12345.678 = 8), voeg dit dan toe voor de ‘return’ in een van de bovenstaande functies:

x = Number(String(x).replace(/[^0-9]/g, ''));

* Houd er rekening mee dat bitwise-operaties in Javascript alleen werken met 32-bits waarden (dus een max van 2.147.483.647). Ga dus niet met de bitwise-versie als u verwacht dat nummers groter dan dat, of het zal gewoon niet werken.


3, Autoriteit 8%

Aangezien dit op een Google-zoektocht naar “JavaScript-nummer van cijfers” kwam, wilde ik het daar weggooien dat er een korter alternatief is voor dit die afhankelijk is van interne gieten die voor u moeten worden gedaan:

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

rendementen

3 4

4, Autoriteit 3%

Het zou eenvoudig zijn om de lengte te krijgen als

 `${NUM}`.length

waar num het nummer is om de lengte te krijgen voor


5

Als u cijfers nodig hebt (na separator), kunt u eenvoudig het nummer van het tweede deel van het aantal (na punt) gesplitst.

function countDigits(number) {
    var sp = (number + '').split('.');
    if (sp[1] !== undefined) {
        return sp[1].length;
    } else {
        return 0;
    }
}

6

Ik ben nog steeds een beetje van het leren JavaScript, maar ik kwam met deze functie in C Awhile geleden, dat wiskunde en een tijdje gebruikt in plaats van een string, dus ik heb het opnieuw geschreven voor JavaScript. Misschien kan dit op de een of andere manier recursief worden gedaan, maar ik heb het concept nog steeds niet echt begrepen 🙁 Dit is het beste waar ik mee kan bedenken. Ik weet niet zeker hoe groot van cijfers het werkt, het werkte toen ik in honderd is gedaan cijfers.

function count_digits(n) {
    numDigits = 0;
    integers = Math.abs(n);
    while (integers > 0) {
        integers = (integers - integers % 10) / 10;
        numDigits++;
    }
    return numDigits;
}

EDIT: werkt alleen met gehele waarden


7

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

8

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

Antwoord 9

Gebruik de volgende uitdrukking om de lengte van het getal te krijgen.

length = variableName.toString().length

Antwoord 10

Je kunt in deze truc het volgende gebruiken:

(''+number).length

Antwoord 11

Twee cijfers: eenvoudige functie als u twee of meer cijfers van een nummer nodig heeft met ECMAScript 6 (ES6):

const zeroDigit = num => num.toString().length === 1 ? `0${num}` : num;

Antwoord 12

Probleeminstructie: Tel nummer/tekenreeks zonder string.length()jsfunction.
Oplossing: we zouden dit kunnen doen via de Forloop. bijv.

for (x=0; y>=1 ; y=y/=10){
  x++;
}
if (x <= 10) {
  this.y = this.number;                
}   
else{
  this.number = this.y;
}    

}


Antwoord 13

Hier is mijn oplossing. Het werkt met positieve en negatieve getallen.
Ik hoop dat dit helpt

function findDigitAmount(num) {
   var positiveNumber = Math.sign(num) * num;
   var lengthNumber = positiveNumber.toString();
 return lengthNumber.length;
}
(findDigitAmount(-96456431);    // 8
(findDigitAmount(1524):         // 4

Antwoord 14

Een oplossing die ook werkt met zowel negatieve getallen als floats, en die geen dure String-manipulatiefuncties aanroept:

function getDigits(n) {
   var a = Math.abs(n);            // take care of the sign
   var b = a << 0;                 // truncate the number
   if(b - a !== 0) {               // if the number is a float
       return ("" + a).length - 1; // return the amount of digits & account for the dot
   } else {
       return ("" + a).length;     // return the amount of digits
   }
}

Antwoord 15

voor gehele getallen kunnen we ook continu delen door 10 implementeren:

var getNumberOfDigits = function(num){
    var count = 1;
    while(Math.floor(num/10) >= 1){
        num = Math.floor(num/10);
        ++count;
    }
    return count;
}
console.log(getNumberOfDigits(1))
console.log(getNumberOfDigits(12))
console.log(getNumberOfDigits(123))

Snippet uitvouwen


Antwoord 16

Hoewel u deze vraag technisch niet beantwoordt, maar als u op zoek bent naar de lengte van het fractionele deel van een getal (bijv. 1.35 => 2of 1 => 0), kan dit u helpen:

function fractionalDigitLength(num) {
  if (Number.isInteger(num)) return 0;
  return String(num).split('.')[1].length;
}

Opmerking: reden waarom ik hier post, omdat ik denk dat mensen die dit antwoord googelen, misschien ook een oplossing willen om alleen de fractionele lengte van een getal te krijgen.


Antwoord 17

u kunt de functie Math.abs gebruiken om negatieve getallen om te zetten in positief en positieven te behouden zoals ze zijn. dan kun je het getal converteren naar string en lengte opgeven.

Math.abs(num).toString().length;

Ik vond deze methode het gemakkelijkst en het werkt best goed. maar als je zeker weet dat je een positief getal krijgt, kun je het gewoon veranderen in een string en dan lengte gebruiken.

num.toString().length

Antwoord 18

De eigenschap length retourneert de lengte van een tekenreeks (aantal tekens).

De lengte van een lege string is 0.

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

Het resultaat van n is:
12

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

Het resultaat van n is:
0


Eigenschap voor arraylengte:


De eigenschap length bepaalt of retourneert het aantal elementen in een array.

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

Het resultaat is: 4

Syntaxis:

Retourneer de lengte van een array:

array.length

Stel de lengte van een array in:

array.length=number

Other episodes