1. 问题描述
给定一个字符串,验证其是否为数字。
2. 问题示例
"0"判断为True,"0.1"判断为True,"abc"判断为False,"1 a"判断为False,"2e10"判断为True。
3.代码实现
使用一个标记变量来记录是否遇到数字、小数点、指数符号和正负号。通过遍历字符串的每个字符,并根据不同的情况进行判断,最终确定字符串是否为数字。
def isNumber(s: str) -> bool:
# 去除字符串两端的空格
s = s.strip()
# 标记是否遇到数字、小数点、指数符号和正负号
hasNumber = False
hasDot = False
hasE = False
hasSign = False
# 遍历字符串中的每个字符
for i in range(len(s)):
# 如果字符是数字,则标记hasNumber为True
if s[i].isdigit():
hasNumber = True
# 如果字符是小数点
elif s[i] == '.':
# 如果之前已经有小数点、指数符号或者没有遇到数字,则返回False
if hasDot or hasE or not hasNumber:
return False
hasDot = True
# 如果字符是指数符号
elif s[i] == 'e' or s[i] == 'E':
# 如果之前已经有指数符号或者没有遇到数字,则返回False
if hasE or not hasNumber:
return False
hasE = True
# 重置hasNumber标记,以便判断指数部分是否有数字
hasNumber = False
# 如果字符是正负号
elif s[i] == '+' or s[i] == '-':
# 如果不是第一个字符,并且前一个字符不是指数符号,则返回False
if i != 0 and s[i-1] != 'e' and s[i-1] != 'E':
return False
hasSign = True
# 其他情况,返回False
else:
return False
# 最后必须有数字,否则返回False
return hasNumber
# 测试
print(isNumber("0")) # True
print(isNumber("0.1")) # True
print(isNumber("abc")) # False
print(isNumber("1 a")) # False
print(isNumber("2e10")) # True