bit4fox - 9 months ago 29

Javascript Question

As the title of my post suggests, I would like to know how many digits

`var number`

`number = 15;`

`2`

`function getlength(number) {`

return number.toString().length();

}

But Safari says it is not working due to a

`TypeError`

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

As you can see,

`'2'`

`not a function`

Answer

`length`

is a property, not a method. You can't call it, hence you don't need parenthesis `()`

:

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

**UPDATE:** As discussed in the comments, the above example won't work for float numbers. To make it working we can either get rid of a period with `String(number).replace('.', '').length`

, or count the digits with regular expression: `String(number).match(/\d/g).length`

.

In terms of speed potentially the fastest way to get number of digits in the given number is to do it mathematically. For *positive integers* there is a wonderful algorithm with `log10`

:

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

For all types of integers (including negatives) there is a brilliant optimised solution from @Mwr247, but be careful with using `Math.log10`

, as it is not supported by many legacy browsers. So replacing `Math.log10(x)`

with `Math.log(x) * Math.LOG10E`

will solve the compatibility problem.

Creating fast mathematical solutions for decimal numbers won't be easy due to well known behaviour of floating point math, so cast-to-string approach will be more easy and fool proof. As mentioned by @streetlogics fast casting can be done with simple number to string concatenation, leading the *replace* solution to be transformed to:

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