4

I am trying to count the number of digits of an input. However, whenever I input 10 or 11 or any two digit number, the output is 325. Why doesn't it work?

inputnumber = int(input())
countnumber = inputnumber
digitcount = 0
while countnumber > 0:
    digitcount += 1
    countnumber = countnumber/10

print(digitcount) 
# result is 325 when input is 10 or 11
smci
  • 26,085
  • 16
  • 96
  • 138
Naya Keto
  • 123
  • 2
  • 8

5 Answers5

5

Your error mainly happened here:

countnumber=countnumber/10

Note that you are intending to do integer division. Single-slash division in Python 3 is always "float" or "real" division, which yields a float value and a decimal part if necessary.

Replace it with double-slash division, which is integer division: countnumber = countnumber // 10. Each time integer division is performed in this case, the rightmost digit is cut.

You also have to watch out if your input is 0. The number 0 is considered to be one digit, not zero.

3

I would not convert that beautiful input to int to be honest.

print(len(input())

would be sufficient.

An easily understandable one liner that no one can complain about.

  • But of course, if negative sign bothers you like wisty said,

    len(str(abs(int (v))))
    

    will be safer for sure.

  • Again, if you are worried about the non numeric inputs like mulliganaceous said, you better cover that case.

    str = input()
    if str.isnumeric():
        print(len(str(abs(v))))
    else:
        print("bad input")
    
BedirYilmaz
  • 2,511
  • 4
  • 27
  • 47
1

The reason is that in python 3 the division of two integers yields a floating point number. It can be fixed using the // operator:

number = int(input())
digits_count = 0
while number > 0:
    digits_count += 1
    number = number // 10
Elisha
  • 22,000
  • 5
  • 54
  • 74
1

You must be using Python3, logically your function is right. You just have to change

countnumber = countnumber // 10

because Python3, // is floor division, meanwhile / is true division.

>>>print(1 / 10)
0.1
>>>print(1 // 10)
0

Btw, as @chrisz said above, you can just simply using the len() function to get the number of digits of the input

>>>print(len(input())
Cypherius
  • 455
  • 2
  • 12
  • 3
    `len(input())` does not give right result for a negative number. Also there is no guarantee that input is a number. – Austin May 22 '18 at 03:44
1
num = int(input())
count = 0
while num > 0:
  count += 1
  num = num // 10
print(count)
  • 2
    While this code block may answer the OP's question, this answer would be much more useful if you explain how this code is different from the code in the question, what you've changed, why you've changed it and why that solves the problem without introducing others. – StupidWolf Aug 09 '20 at 09:48