題目描述
請實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
思路
根據題目給出的一些規則,可以表示成數值的字符串類型有:int整型,float浮點型,指數型(包括e和E),當然,前面三種都可以帶上正負號;
不能表示成數值的字符串類型有:指數型錯誤(沒有指數或者指數是小數,或者指數變成了a),float浮點型錯誤,第一個正負號后又帶了正負號
於是,正負號類型的錯誤可以用if..else去判斷;而在判定為沒有正負號的錯誤下,再判斷是否可以表達為數值型,就可以用float函數,再加上try..except
解答
class Solution: # s字符串 def isNumeric(self, s): # write code here if s[0]=="+" or s[0]=="-": if s[1]!="+" and s[1]!="-": try: if float(s[1:]): return True except: return False else: return False else: try: if float(s): return True except: return False
也可以很准確地去判斷:
class Solution: # s字符串 def isNumeric(self, s): # write code here if s is None or len(s) == 0: return False # 是否有e hasE = False # 是否有小數 isDecimal = False # 是否有+-符號 hasSign = False for i in range(len(s)): # 如果有e,只能有一個e且不能是最后一個 if s[i] == "e" or s[i] == "E": if hasE or i == len(s) - 1: return False hasE = True # 小數點不能重復出現或和e共線 elif s[i] == ".": if hasE or isDecimal: return False isDecimal = True elif s[i] == "-" or s[i] == "+": # 重復出現符號時,必須跟在e后面 if hasSign and s[i - 1] != "e" and s[i - 1] != "E": return False # 重復出現符號時,必須跟在e后面 if not hasSign and i > 0 and s[i - 1] != "e" and s[i - 1] != "E": return False hasSign = True elif s[i] < "0" or s[i] > "9": return False return True