räkna - Hämta antal siffror med JavaScript
Som titeln på mitt inlägg antyder, skulle jag vilja veta hur många siffror var number har. Till exempel: Om number=15; borde min funktion returnera 2. För närvarande ser det ut så här:
function getlength(number) {
return number.toString().length();
}
Men Safari säger att det inte fungerar på grund av ett TypeError:
'2' is not a function (evaluating 'number.toString().length()')
Som du kan se, '2' är faktiskt den rätta lösningen. Men varför är det inte en funktion?
Svar #1
length är en egenskap, inte en metod. Du kan inte anropa den, därför behöver du inte parenteser ():
function getlength(number) {
return number.toString().length;
}
UPPDATERING: Som diskuterats i kommentarerna, kommer inte exemplet ovan att fungera för flyttal. För att få det att fungera kan vi antingen ta bort en punkt med String(number).replace('.', '').length, eller räkna siffrorna med reguljärt uttryck: String(number).match(/\d/g).length.
När det gäller hastighet är det potentiellt det snabbaste sättet att få antalet siffror i det givna talet att göra det matematiskt. För positiva heltal finns det en fantastisk algoritm med log10:
var length = Math.log(number) * Math.LOG10E + 1 | 0; // for positive integers
För alla typer av heltal (inklusive negativa) finns det en lysande optimerad lösning från @Mwr247, men var försiktig med att använda Math.log10, eftersom det inte stöds av många äldre webbläsare. Att ersätta Math.log10(x) med Math.log(x) * Math.LOG10E löser kompatibilitetsproblemet.
Att skapa snabba matematiska lösningar för decimaltal kommer inte att vara enkelt på grund av välkänd beteende hos flyttalsmatematik, så ett till-sträng-omvandlingssätt kommer att vara enklare och idiotsäkert. Som nämnts av @streetlogics kan snabb omvandling göras med enkel tal-till-sträng-konkatenering, vilket leder till att replace-lösningen kan omvandlas till:
var length = (number + '').replace('.', '').length; // for floats
Svar #2
Här är ett matematiskt svar (fungerar även för negativa tal):
function numDigits(x) {
return Math.max(Math.floor(Math.log10(Math.abs(x))), 0) + 1;
}
Och en optimerad version av ovanstående (mer effektiva bitvisa operationer): *
function numDigits(x) {
return (Math.log10((x ^ (x >> 31)) - (x >> 31)) | 0) + 1;
}
I princip börjar vi med att ta det absoluta värdet av insignal för att låta negativa värden fungera korrekt. Sedan kör vi log10-operationen för att ge oss vilken tiopotens insignal är (om du arbetade i en annan bas skulle du använda logaritmen för den basen), vilket är antalet siffror. Sedan avrundar vi nedåt resultatet för att bara få den heltaliga delen av det. Slutligen använder vi max-funktionen för att fixa decimaltal (vilket som helst bråktal mellan 0 och 1 ger bara 1 istället för ett negativt tal) och lägger till 1 till slutresultatet för att få räkningen.
Ovanstående förutsätter (baserat på ditt exempelinput) att du vill räkna antalet siffror i heltal (så 12345=5, och därmed 12345.678=5 också). Om du vill räkna det totala antalet siffror i värdet (så 12345.678=8), lägg då till detta innan 'return' i någon av funktionerna ovan:
x = Number(String(x).replace(/[^0-9]/g, ''));
* Vänligen notera att bitvisa operationer i JavaScript endast fungerar med 32-bitars värden (max 2 147 483 647). Så använd inte den bitvisa versionen om du förväntar dig större tal än så, annars kommer det helt enkelt inte att fungera.
Svar #3
Eftersom detta dök upp vid en Google-sökning på "javascript get number of digits", ville jag nämna att det finns ett kortare alternativ till detta som förlitar sig på att intern typomvandling görs åt dig:
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);
Avkastning
3 4
Svar #4
det skulle vara enkelt att få längden som
`${NUM}`.length
där NUM är numret för vilket man vill få längden
