How to convert "String" to "Int" without using library functions in Python
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
Dennis M.
Updated on June 26, 2022Comments
-
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 over 6 yearsand
enumerate
:) -
Ajax1234 over 6 yearsI completely forgot about the OP's requirement barring all builtin functions, not just
int
:) Please see my recent edit. -
dabadaba over 6 years
range
andlen
are also built-in functions aren't they? you can just dofor i in a
-
Izaak van Dongen over 6 yearsYou might be able to avoid using
range
orlen
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 tolist.__getitem__
? -
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 over 6 yearsI 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 likerange
orlen
is fine. -
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 over 6 years
ord
is clearly a library function and thus not allowed. -
Stefan Pochmann over 6 years@IzaakvanDongen And isn't
a + b
really a call toa.__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 almost 5 yearsord is a library function
-
E-WAVE over 2 yearsWhy 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