How to find length of digits in an integer?
Without conversion to string
import mathdigits = int(math.log10(n))+1
To also handle zero and negative numbers
import mathif n > 0: digits = int(math.log10(n))+1elif n == 0: digits = 1else: digits = int(math.log10(-n))+2 # +1 if you don't count the '-'
You'd probably want to put that in a function :)
Here are some benchmarks. The
len(str()) is already behind for even quite small numbers
timeit math.log10(2**8)1000000 loops, best of 3: 746 ns per looptimeit len(str(2**8))1000000 loops, best of 3: 1.1 µs per looptimeit math.log10(2**100)1000000 loops, best of 3: 775 ns per loop timeit len(str(2**100))100000 loops, best of 3: 3.2 µs per looptimeit math.log10(2**10000)1000000 loops, best of 3: 844 ns per looptimeit len(str(2**10000))100 loops, best of 3: 10.3 ms per loop
All math.log10 solutions will give you problems.
math.log10 is fast but gives problem when your number is greater than 999999999999997. This is because the float have too many .9s, causing the result to round up.
The solution is to use a while counter method for numbers above that threshold.
To make this even faster, create 10^16, 10^17 so on so forth and store as variables in a list. That way, it is like a table lookup.
def getIntegerPlaces(theNumber): if theNumber <= 999999999999997: return int(math.log10(theNumber)) + 1 else: counter = 15 while theNumber >= 10**counter: counter += 1 return counter