搜尋

首頁  >  問答  >  主體

Python 字符串转数字

python自带的int函数在值中出现字符串的情况下会出现错误

python>>> int('232d')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '232d'

而js中parseInt则不会出现类似问题

javascriptvar num = parseInt('2323d')
num == 2323

那么,如何用python实现一个类似js的parseInt函数(尽量不用正则)

下面是我实现的一个,但是有没有更好的方法

pythondef safe_int(num):
    try:
        return int(num)
    except ValueError:
        result = []
        for c in num:
            if not ('0' <= c <= '9'):
                break
            result.append(c)
        if len(result) == 0:
            return 0
        return int(''.join(result))
ringa_leeringa_lee2796 天前966

全部回覆(3)我來回復

  • 阿神

    阿神2017-04-17 14:36:24

    雷雷

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 14:36:24

    python    from functools import reduce
        def parseInt(s):
            return reduce(lambda x, y: x*10+y, map(int, filter(lambda c : c>='0' and c<='9', s)))
    

    針對

    謝謝,但是'234jdsf23232ks'會轉換為23423232,這不是想要的結果

    這一情況,再看了下原問題,其實原問題關鍵之處即在於剝離出這樣一個簡單問題“查找到字符串中第一個不為數字的字符的位置 」。

    python    def find(s):
            for i in range(len(s)):
                if not '0'<=s[i]<='9':
                    return i
            return len(s)
    

    找到這個位置後,然後用切片函數和int方法就可以完成任務了。

    python    s = '234jdsf23232ks'
        idx = find(s)
        int(s[0:idx])
    

    思路跟題主的差不多^-^

    回覆
    0
  • PHPz

    PHPz2017-04-17 14:36:24

    借用itertools寶藏的話,核心代碼一句話
    takewhile 傳回頭部符合條件的元素的迭代器。

    from itertools import takewhile
    def parseInt(s):
        assert isinstance(s, basestring)
        return int(''.join(list(takewhile(lambda x:x.isdigit(),s)))) if s[0].isdigit() else None

    回覆
    0
  • 取消回覆