Adding numbers in a string

跟風遠走 提交于 2019-12-12 03:29:54

问题


I have a string as an input for the code I'm writing and let an example of the string be:

"12 inches  makes   1   foot"

My goal is to have my code run through this string and just pull out the integers and add them. So the output for the string above would be 13. I am using try and except in here as well since another sample input string could be something like "pi is 3.14".

msg= "12    inches  makes   1   foot"

thesum = 0

s= msg.split()

for a in s:

    try:

        if a == int(a):
            a= int(a)
            thesum += a
        print (thesum)
    except ValueError as e:


        print("Value Error: no int present")

I did what is above and I am not getting it to add the value of a (if it is an int) to "thesum". How can I get this to work? Also, I do want to have it in the try, except format so that I can call the ValueError


回答1:


There is no need to check equality with a string. In fact, just try '4' == 4 in an interpreter. The answer is False because strings and integers are never equivalent. Just put thesum += int(a) into the loop instead of your if statement. If you don't want try-except, use if a.isdigit(): instead of try: and take out except: altogether:

for a in s:
    if a.isdigit():
        thesum += int(a)
        print(thesum)

A good way would be the combination of several built-ins:

string = "12 inches makes 1 foot"
total = sum(map(int, filter(str.isdigit, string.split())))

filter() finds only the characters that are digits. We then convert each to an integer with map() and find the total with sum().




回答2:


a is str, and int(a) is int(if possible), so a == int(a) will never equal.

just add the value of int(a), if the convert fails, it will raise ValueError.

The following codes should work.

msg= "12    inches  makes   1   foot"
thesum = 0
s= msg.split()
for a in s:
    try:
        thesum += int(a)
    except ValueError as e:
        print a
print thesum



回答3:


I like "re" and comprehension to make it easier to read:

import re
print(sum(int(a) for a in re.findall(r'\d+', '12 inches make 1 foot')))

Then you can extend the regular expression for floats, etc.




回答4:


Most of the earlier approaches discount the second input which is "pi is 3.14". Although question has been asked with stated assertion of parsing integer. It requires treatment of numbers as float to successfully process second input.

import unittest
import re


def isDigit(s):
 return re.match(r'[\d.]+', s)

def stringParse(input):
 input = [i.strip() for i in input.split()]
 input = filter(lambda x: isDigit(x), input)
 input = map(lambda x: float(x), input)
 return sum(input)

class TestIntegerMethods(unittest.TestCase):

 def test_inches(self):
  self.assertEqual(stringParse("12 inches  makes   1   foot"), 13.0)

 def test_pi(self):
  self.assertTrue(stringParse('pi is 3.14'), 3.14)

if __name__ == '__main__':
 unittest.main()

Another take on the problem



来源:https://stackoverflow.com/questions/36903462/adding-numbers-in-a-string

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!