题目

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。

思路

2.1 剑指offer 表示数值的字符串
全面考虑数值中,整数,小数,指数部分的特点,比如哪些部分可以出现正负号,而哪些部分不能。
'.'前或后可以没有没有数字
'e/E’前面必须有数字,后面必须是整数

代码

def isNumeric(s):
    spl = s.split('.')
    if len(spl)>2: # 不能有超过(含)两个小数点的
        return False
    elif len(spl)>1: # decimal
        integer = spl[0]
        last = spl[1]
        if integer[0] == '+' or integer[0] == '-':
            integer = integer[1:]
        if not checkint(integer):
            return False
        # 小数部分不能带符号
        if (last[0] == '+' or last[0] == '-'):
            return False
    else:
        integer = None
        last = spl[0]

    # 整数小数都为空
    if (integer == None and len(last) == 0 ):
        return False
    
    spe = last.split('e')
    spE = last.split('E')
    exponent = None
    if len(spe)>1:
        aheade = spe[0]
        exponent = spe[1]
    elif len(spE) >1:
        aheade = spE[0]
        exponent = spE[1]
    else:
        aheade = spe[0]
        # 小数部分是0-9
        if integer != None and checkint(aheade):
            return True
        # 无小数且无指数,如果不是纯整数,那么就不是数值
        if integer == None:
            if aheade[0] == '+' or aheade[0] == '-':
                aheade = aheade[1:]
            if checkint(aheade):
                return True
            return False
    # 指数前/后面要有数字
    if len(aheade) == 0 or len(exponent) == 0:
        return False
    # 指数后面不能是小数
    if len(exponent.split('.'))>1:
        return False
    if exponent[0] == '+' or exponent[0] == '-':
        exponent = exponent[1:]
    if checkint(exponent):
        return True

def checkint(s):
    l = [str(i) for i in range(10)] # 定义整数转换的字符串数组
    for i in range(len(s)):
        if s[i] in l:
            continue
        else:
            return False
    return True

相关文章:

  • 2022-12-23
  • 2022-02-27
  • 2021-10-13
  • 2021-07-14
  • 2022-12-23
  • 2021-10-16
  • 2021-12-09
猜你喜欢
  • 2021-12-30
  • 2021-07-23
  • 2022-12-23
  • 2021-10-27
  • 2022-01-01
  • 2021-08-28
  • 2021-10-03
相关资源
相似解决方案