有效数字(按顺序)可以分成以下几个部分:
小数(按顺序)可以分成以下几个部分:
整数(按顺序)可以分成以下几个部分:
部分有效数字列举如下:[“2”, “0089”, “-0.1”, “+3.14”, “4.”, “-.9”, “2e10”, “-90E3”, “3e+7”, “+6e-1”, “53.5e93”, “-123.456e789”]
部分无效数字列举如下:[“abc”, “1a”, “1e”, “e3”, “99e2.5”, “–6”, “-+3”, “95a54e53”]
给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。
输入:s = "0"
输出:true
输入:s = "e"
输出:false
输入:s = "."
输出:false
1 )正则
function isNumber(s: string): boolean {
return new RegExp(`^([+-]?\\d+\\.?\\d*|[+-]?\\d*\\.?\\d+)([eE]([+-]?\\d+))?$`).test(s);
};
2 )原生API
function isNumber(s: string): boolean {
if(s == "Infinity"||s=="-Infinity"||s=="+Infinity") return false
return !isNaN(Number(s));
}
3 )邻接表(图)标识的状态机
function isNumber(s: string): boolean {
const graph = {
0: {'blank': 0, 'sign': 1, '.': 2, 'digit': 6},
1: {'digit': 6, '.': 2},
2: {'digit': 3},
3: {'digit': 3, 'e': 4},
4: {'digit': 5, 'sign': 7},
5: {'digit': 5},
6: {'digit': 6, '.': 3, 'e': 4},
7: {'digit': 5},
}
let state = 0; // 记录一个变量
// 遍历字符串, 先取出字符串的前后空格
for(let c of s.trim()) {
// 接下来把字符稍微做一些转化
if(c >='0' && c <= '9') {
// js做比较时候,会把字符转换成数字
c = 'digit';
} else if(c === ' ') {
c = 'blank';
} else if(c === '+' || c === '-') {
c = 'sign';
}
// 获取新的状态 这里 toLowerCase 防止 E 的出现, 其他字符不是字母也不会报错
state = graph[state][c.toLowerCase()];
if(!state) return false;
}
return [3, 5, 6].includes(state);
}