验证给定的字符串是否可以解释为十进制数字。
例如:
"0" => true " 0.1 " => true "abc" => false "1 a" => false "2e10" => true " -90e3 " => true " 1e" => false "e3" => false " 6e-1" => true " 99e2.5 " => false "53.5e93" => true " --6 " => false "-+3" => false "95a54e53" => false
说明: 我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。这里给出一份可能存在于有效十进制数字中的字符列表:
- 数字 0-9
- 指数 - "e"
- 正/负号 - "+"/"-"
- 小数点 - "."
当然,在输入中,这些字符的上下文也很重要。
思路: 这个问题要求我们验证一个字符串是否可以解释为一个有效的十进制数字。根据题目描述,我们需要考虑以下几种情况:
- 字符串可以包含数字 0-9。
- 可以包含一个小数点 .,但只能出现一次。
- 可以包含一个指数部分 e 或 E,后面跟着一个正负号和数字。
- 字符串可以以正负号开头,但不能同时包含多个正负号。
- 字符串不能包含任何其他字符。
基于以上规则,我们可以按照以下步骤实现算法:
- 去除空白:首先去除字符串两端的空白字符。
- 检查空字符串:如果去除空白后的字符串为空,直接返回 false。
- 检查正负号:如果字符串以正负号开头,确保整个字符串只有一个正负号。
- 检查小数点:如果字符串包含小数点,确保只有一个小数点,并且小数点不在字符串的开头或结尾。
- 检查指数部分:如果字符串包含 e 或 E,确保它后面紧跟着正负号和数字。
- 用正则表达式:使用正则表达式来匹配上述所有规则,如果字符串符合规则,则返回 true,否则返回 false。
/**
* @param {string} s
* @return {boolean}
*/
var isNumber = function(s) {
// 去除字符串两端的空白字符
s = s.trim();
// 正则表达式匹配有效的十进制数字
const regex = /^-?\d*(\.\d+)?([eE]-?\d+)?$/;
// 检查字符串是否匹配正则表达式
return regex.test(s);
};