判断字符串是否表示数值

Mr.ClarkAbout 2 min

判断字符串是否表示数值

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

部分数值列举如下:
["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]
部分非数值列举如下:
["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
示例 1:
输入:s = "0"
输出:true
示例 2:
输入:s = "e"
输出:false
示例 3:
输入:s = "."
输出:false
示例 4:
输入:s = "    .1  "
输出:true

此题可以使用有限状态自动机来解,列好一个状态表, 如在第一个字符中有符合的状态,则转入到下一个可能的状态规则中。 如第一个字符只可能是空白,正负号,数字,或小数点

def isNumber(s):
    '''列好所有状态
    整数
    小数
    科学计数
    '''
    states = [
            { ' ': 0, 's': 1, 'd': 2, '.': 4 }, # 0. 开头可能的四种状态
            { 'd': 2, '.': 4 } ,                # 1. 正负号后2种的状态
            { 'd': 2, '.': 3, 'e': 5, ' ': 8 }, # 2. 数字后的状态,如果是整数,则状态停留在2
            { 'd': 3, 'e': 5, ' ': 8 },         # 3. 小数点后的状态
            { 'd': 3 },                         # 4. 小数点后跟数字的状态
            { 's': 6, 'd': 7 },                 # 5. 'e'后,如 1.03E+08
            { 'd': 7 },                         # 6. e跟上数字之后
            { 'd': 7, ' ': 8 },                 # 7. e跟上数字之后,结尾状态
            { ' ': 8 }                          # 8. 以空白结尾
        ]
    p=0
    for i in s:
        if '0'<=i<='9':t='d'
        elif i in '+-':t='s'
        elif i in 'eE':t='e'
        elif i in '. ':t=i
        else: t='?'

        if t not in states[p]:return False
        p = states[p][t]
    return p in [2,3,7,8]

print(isNumber('1.03E+08'))

这些状态分类看上似很复杂,其实按 整数小数科学计数 三大类型一一跟踪补齐状态就可以解决。