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
则不会出现类似问题
javascript
var num = parseInt('2323d') num == 2323
那么,如何用python实现一个类似js的parseInt
函数(尽量不用正则)
下面是我实现的一个,但是有没有更好的方法
python
def 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))
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])
思路跟題主的差不多^-^
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