字符转数字

本文最后更新于:7 个月前

// 字符转数字,有限状态机

function atoi(str) {
    let state = 'start';
    let sign = 1;
    let ans = 0;
    let statue = {
        'start': ['start', 'signed', 'number', 'end'],
        'signed': ['end', 'end', 'number', 'end'],
        'number': ['end', 'end', 'number', 'end'],
        'end': ['end', 'end', 'end', 'end'],
    }
    let getC = char => {
        if (char === ' ') {
            return 0
        } else if (char == '+' || char == '-') {
            return 1
        } else if (typeof Number(char) == 'number' && !isNaN(Number(char))) {
            return 2
        } else {
            return 3
        }
    }
    let getD = char => {
        state = statue[state][getC(char)];
        if (state === 'signed') {
            sign = char === '-' ? -1 : 1;

        } else if (state === 'number') {
            ans = sign === -1 ? Math.min(ans * 10 + (char - 0), Math.pow(2, 31)) : Math.min(ans * 10 + (char - 0), Math.pow(2, 31) - 1);
        }
    }
    for (var i = 0; i < str.length; i++) {
        getD(str[i])
    }
    return ans * sign;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!