str.isdigit() 方法只检查字符串是否由纯数字字符组成,并且这些字符不能包含小数点 () 或任何其他符号。

"123.45".isdigit() 的结果是 False。
str.isdigit() 详解
isdigit() 是 Python 字符串的一个内置方法,它的官方定义是:
如果字符串中的所有字符都是数字,并且至少有一个字符,则返回
True,否则,返回False。
这里的“数字字符”指的是 Unicode 中定义为“数字”的字符,主要包括:

0到9的阿拉伯数字- 一些其他 Unicode 数字字符,
- (上标2)
- (上标3)
- (上标4)
- (上标5)
- (上标6)
- (上标7)
- (上标8)
- (上标9)
- (上标0)
关键点:小数点 () 不被认为是数字字符。
示例代码
# 正整数,返回 True
print("12345".isdigit()) # 输出: True
# 包含字母,返回 False
print("123a45".isdigit()) # 输出: False
# 包含空格,返回 False
print("123 45".isdigit()) # 输出: False
# 包含小数点,返回 False
print("123.45".isdigit()) # 输出: False
# 包含负号,返回 False
print("-123".isdigit()) # 输出: False
# 包含上标数字,返回 True
print("10²".isdigit()) # 输出: True
如何正确判断一个字符串是否是数字(包括小数)?
既然 isdigit() 不行,我们有几种更可靠的方法来判断一个字符串是否代表一个有效的数字(整数或浮点数)。
使用 try-except 块(最推荐、最健壮)
这是最常用也是最稳妥的方法,它尝试将字符串转换为浮点数,如果成功,说明它是一个有效的数字;如果失败(抛出 ValueError 异常),则说明不是。
def is_number(s):
try:
float(s)
return True
except ValueError:
return False
# --- 测试 ---
print(f"'123' -> {is_number('123')}") # 输出: '123' -> True
print(f"'123.45' -> {is_number('123.45')}") # 输出: '123.45' -> True
print(f"'-78.9' -> {is_number('-78.9')}") # 输出: '-78.9' -> True
print(f"'+100' -> {is_number('+100')}") # 输出: '+100' -> True
print(f"'abc' -> {is_number('abc')}") # 输出: 'abc' -> False
print(f"'12.3.4' -> {is_number('12.3.4')}") # 输出: '12.3.4' -> False
print(f"' 123 ' -> {is_number(' 123 ')}") # 输出: ' 123 ' -> True (float可以处理前后空格)
print(f"'1e10' -> {is_number('1e10')}") # 输出: '1e10' -> True (科学计数法)
优点:

- 非常健壮,能处理所有合法的数字格式(整数、小数、科学计数法、带正负号)。
- 代码意图清晰,易于理解。
使用正则表达式(灵活、强大)
如果你需要更精确地控制数字的格式(不允许科学计数法或前后空格),正则表达式是最佳选择。
import re
# 模式解释:
# ^ - 字符串开始
# [+-]? - 可选的正号或负号
# \d+ - 一个或多个数字
# (\.\d+)? - 可选的小数部分(一个点后跟一个或多个数字)
# $ - 字符串结束
pattern = r'^[+-]?\d+(\.\d+)?$'
def is_number_regex(s):
return bool(re.match(pattern, s))
# --- 测试 ---
print(f"'123' -> {is_number_regex('123')}") # 输出: '123' -> True
print(f"'123.45' -> {is_number_regex('123.45')}") # 输出: '123.45' -> True
print(f"'-78.9' -> {is_number_regex('-78.9')}") # 输出: '-78.9' -> True
print(f"'+100' -> {is_number_regex('+100')}") # 输出: '+100' -> True
print(f"'abc' -> {is_number_regex('abc')}") # 输出: 'abc' -> False
print(f"'12.3.4' -> {is_number_regex('12.3.4')}") # 输出: '12.3.4' -> False
print(f"' 123 ' -> {is_number_regex(' 123 ')}") # 输出: ' 123 ' -> False (这个模式不允许空格)
print(f"'1e10' -> {is_number_regex('1e10')}") # 输出: '1e10' -> False (这个模式不允许科学计数法)
优点:
- 灵活性极高,可以精确匹配你想要的数字格式。
- 对于复杂的格式校验非常强大。
缺点:
- 对于简单的判断,代码比
try-except更复杂。
总结与对比
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
str.isdigit() |
只判断非负整数 | 语法简单 | 功能非常有限,无法处理小数、负数、空格等。 |
try-except |
通用场景,判断所有数字 | 最健壮、最推荐,能处理各种格式,代码清晰。 | 如果字符串是无效数字,会抛出异常(虽然被捕获了)。 |
| 正则表达式 | 需要精确控制数字格式时 | 灵活、强大,可定制性强。 | 对于简单判断,代码相对复杂,性能可能略低于 try-except。 |
- 如果你的字符串可能包含小数点、负号、空格,并且你想知道它是不是一个合法的数字,请使用
try-except。 - 如果你的字符串只可能是纯数字(如从输入框获取的纯数字ID),并且你想快速判断,可以使用
str.isdigit()。 - 如果你对数字的格式有非常严格的要求(必须保留两位小数,或者不能有正号),请使用正则表达式。
