How to convert "String" to "Int" without using library functions in Python

10,994

Solution 1

The "purest" I can think of:

>>> a = "546"
>>> result = 0
>>> for digit in a:
        result *= 10
        for d in '0123456789':
            result += digit > d

>>> result
546

Or using @Ajax1234's dictionary idea if that's allowed:

>>> a = "546"
>>> value = {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9}
>>> result = 0
>>> for digit in a:
        result = 10 * result + value[digit]

>>> result
546

Solution 2

You can keep a dictionary that stores the string and integer values of a numeric key, and then iterate over the string. While iterating over the string, you can use enumerate to keep track of the index and then raise 10 to that power minus 1 and then multiply by the corresponding key from the dictionary:

a = "546"
length = 0
for i in a:
   length += 1
d = {'1': 1, '0': 0, '3': 3, '2': 2, '5': 5, '4': 4, '7': 7, '6': 6, '9': 9, '8': 8}
count = 0
counter = 0
for i in a:
   count += (10**(length-counter-1)*d[i])
   counter += 1
print(count)

Output:

546

Solution 3

The trick is that 546 = 500 + 40 + 6, or 5*10^2 + 4*10^1 + 6*10^0.

Note how the exponent is just the index (in reverse). Using that, you can generalize this approach into a function:

def strToInt(number):
    total = 0                             # this is where we accumulate the result
    pwr = len(number) - 1                 # start the exponent off as 2
    for digit in number:                  # digit is the str "5", "4", and "6"
        digitVal = ord(digit) - ord('0')  # using the ascii table, digitVal is the int value of 5,4, and 6.
        total += digitVal * (10 ** pwr)   # add 500, then 40, then 6
        pwr -= 1                          # make sure to drop the exponent down by one each time
    return total

And you can use it like so:

>>> strToInt("546")
546

Solution 4

def stringToInt(s):
    result = 0
    value = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
    for digit in s:
        result = 10 * result + value[digit]

    return result
Share:
10,994
Dennis M.
Author by

Dennis M.

Updated on June 26, 2022

Comments

  • Dennis M.
    Dennis M. almost 2 years

    I need it for a homework and we have got a new teacher who said we should google it but i didn't find a helpful answer.

    I try to convert for example: a = "546" to a = 546 without any library functions

    Thanks for your help in advance!

  • dabadaba
    dabadaba over 6 years
    and enumerate :)
  • Ajax1234
    Ajax1234 over 6 years
    I completely forgot about the OP's requirement barring all builtin functions, not just int :) Please see my recent edit.
  • dabadaba
    dabadaba over 6 years
    range and len are also built-in functions aren't they? you can just do for i in a
  • Izaak van Dongen
    Izaak van Dongen over 6 years
    You might be able to avoid using range or len by first slicing with [::-1] and then incrementing the power manually. However, I think that the builtin functions thing is probably more of a problem with the question's phrasing than this answer - where does a function stop? Isn't a list indexing a call to list.__getitem__?
  • Izaak van Dongen
    Izaak van Dongen over 6 years
    @Evan and this results in good, readable, educative code. I think this answer is more in the spirit of the task than trying to golf any builtin words out of your code.
  • dabadaba
    dabadaba over 6 years
    I mean, I think we're all probably overkilling it. I guess the teacher was trying to disuade students from using int(), but I'd think using any other common built-in function like range or len is fine.
  • Ajax1234
    Ajax1234 over 6 years
    @dabadaba I agree, but I think it also makes sense to cover every angle of the problem and how it can be interpreted.
  • Stefan Pochmann
    Stefan Pochmann over 6 years
    ord is clearly a library function and thus not allowed.
  • Stefan Pochmann
    Stefan Pochmann over 6 years
    @IzaakvanDongen And isn't a + b really a call to a.__add__(b)? :-). So yeah, I don't think we can get anywhere if we don't allow such stuff that at least doesn't "look like" function calls. That said, I did go a bit further in mine.
  • mastisa
    mastisa almost 5 years
    ord is a library function
  • E-WAVE
    E-WAVE over 2 years
    Why multiplying by the result by 10 though ? because i don't see any effect given that the original value of the result variable is zero