1、不允许使用正则或者框架或者第三方提供的判断数字的方法。需要自行实现判断逻辑 2、对于十进制数字,需要支持科学计数法 3、如果一个字符串既是十进制数字,又是十六进制数字,得到的结果应该是两者都是 4、不应存在无效的(违反常规的)字符。例如1是合法的十进制和十六进制数字,001则是非法的
时间: 2023-12-03 20:46:13 浏览: 155
零基础学python全套课后题带目录.doc
好的,根据你的需求,我可以给出如下的判断数字的实现逻辑:
1. 首先判断字符串是否为空或只包含空格,若是则返回 False。
2. 若字符串开头为 '+' 或 '-',则将其去掉。
3. 判断字符串是否包含 'e' 或 'E',若包含,则将其按照指数符号进行分割成底数和指数两部分。
4. 对于底数部分,判断其是否为一个小数,即是否包含小数点 '.'。如果不是小数,则判断其是否为一个整数,即判断其是否只包含数字字符 '0'-'9'。如果是小数,则将其按小数点进行分割成整数部分和小数部分两部分,然后分别判断两部分是否只包含数字字符。
5. 对于指数部分,判断其是否为一个整数,即判断其是否只包含数字字符,并且不能以 0 开头。
6. 对于整个字符串,判断其是否只包含数字字符和小数点 '.',并且小数点的个数不能超过 1。
7. 最后,如果字符串以 '0x' 或 '0X' 开头,则将其判断为十六进制数字。否则,将其判断为十进制数字。
下面是给出实现该逻辑的 Python 代码:
```python
def is_number(s):
if not s or s.isspace():
return False
# remove leading '+' or '-'
if s[0] in ('+', '-'):
s = s[1:]
# split into mantissa and exponent
if 'e' in s or 'E' in s:
s = s.lower()
parts = s.split('e')
if len(parts) != 2:
return False
if '.' in parts[1]:
return False
return is_mantissa(parts[0]) and is_integer(parts[1])
return is_mantissa(s)
def is_mantissa(s):
if not s:
return False
has_dot = False
parts = s.split('.')
if len(parts) > 2:
return False
if len(parts) == 2:
if not parts[0] and not parts[1]:
return False
if not parts[0]:
parts[0] = '0'
if not parts[1]:
parts[1] = '0'
has_dot = True
for p in parts:
if not is_integer(p):
return False
return not has_dot or len(parts[1]) > 0
def is_integer(s):
if not s or s[0] == '0':
return False
for c in s:
if c < '0' or c > '9':
return False
return True
def is_hexadecimal(s):
if not s.startswith('0x') and not s.startswith('0X'):
return False
for c in s[2:]:
if not (c >= '0' and c <= '9') and not (c >= 'a' and c <= 'f') and not (c >= 'A' and c <= 'F'):
return False
return True
def is_number_with_hexadecimal(s):
return is_number(s) and is_hexadecimal(s)
# test case
print(is_number('123')) # True
print(is_number('123.456')) # True
print(is_number('1.23e+4')) # True
print(is_number('0.2e-3')) # True
print(is_number('0x7f')) # True
print(is_number('0x7F')) # True
print(is_number('123 456')) # False
print(is_number('00123')) # False
print(is_number('123.')) # False
print(is_number('123..')) # False
print(is_number('.123')) # True
print(is_number('1.23.4')) # False
print(is_number('1e')) # False
print(is_number('1e+')) # False
print(is_number('1e1.23')) # False
print(is_number('1.23e+4.56')) # False
print(is_number('1.23e-4.56')) # False
print(is_number('1.23e+')) # False
print(is_number('+123')) # True
print(is_number('-123')) # True
print(is_number('')) # False
print(is_number_with_hexadecimal('0x7f')) # True
print(is_number_with_hexadecimal('0x7F')) # True
print(is_number_with_hexadecimal('123')) # False
```
阅读全文