HOWTO · Python

在 Python 中檢查字串是否為數字

了解如何檢查 Python 字串是否能轉換為浮點數、處理 ValueError,並理解為什麼只檢查數字的方法適用範圍較窄。

本頁內容

若要檢查字串能否轉換為 Python 浮點數,請呼叫 float() 並處理 ValueError。這項檢查依據 Python 的浮點數語法;應用程式可能還需要額外規則,例如拒絕無窮值或 NaN。

在 Python 中使用 float() 函式檢查字串是否為數字

執行以下範例:

print(float("22.23"))
22.23

float() 接受的格式不只有小數。它可以轉換整數表示法、帶正負號的數值、指數表示法,以及前後帶空白字元的字串,例如 "22"、"-3.5"、"1e3" 和 " 4.2 "。不符合浮點數語法的文字,例如 "developer" 或 "2.3.4",會引發 ValueError。

處理來自檔案或其他外部來源的資料時,可以將轉換封裝在一個小型輔助函式中。需要使用轉換結果時就返回該值;轉換失敗時則返回 None。這樣就不必針對每個值另行編寫字元檢查。

def parse_float(value):
    try:
        return float(value)
    except ValueError:
        return None


for value in ("22.23", "developer"):
    result = parse_float(value)
    print(result)
22.23
None

轉換成功時,輔助函式會返回轉換後的數值;否則返回 None。如果只需要布林值,可以使用相同的 try/except ValueError 模式:轉換成功後返回 True,在例外處理常式中返回 False。無法解析文字時應捕獲 ValueError;不要將這種情況描述為 OverflowError。

轉換成功不代表結果一定是有限值。對於 Python 支援的相應寫法,float() 可以產生無窮值或 NaN。如果應用程式只允許有限值,應將轉換結果交給 math.isfinite() 單獨檢查,作為另一項規則。

在 Python 中使用 isdigit() 和 partition() 函式檢查字串是否為數字

isdigit() 檢查的問題範圍較窄:字串中的每個字元是否都是數字。對於常見的小數表示、正負號和指數表示,它都會返回 False,因此不能用作通用的浮點數驗證。例如,"4546".isdigit() 為真,而 "4546.4646".isdigit() 和 "-12".isdigit() 為假,即使 float() 可以轉換後兩個字串。

只有在你明確支援某種有限格式時才使用 partition(),例如由數字、小數點和更多數字組成的格式。它會返回第一個分隔符之前的文字、分隔符本身以及之後的文字。因此可以明確檢查各個部分,同時讓規則保持簡單、易於審查。

value = "4546.4646"
whole, point, fraction = value.partition(".")
is_simple_decimal = (
    value.count(".") == 1
    and point == "."
    and whole.isdigit()
    and fraction.isdigit()
)
print(is_simple_decimal)

此檢查接受範例中小數點兩側都有數字的格式。它會拒絕只有整數的輸入、小數點前後缺少數字的輸入、帶正負號的輸入、前後帶空白字元的輸入,以及指數表示法。Python 的 float() 可以接受其中幾種格式,包括整數、帶正負號的數值、空白字元和指數表示法,因此此檢查並不等同於浮點數解析。另外,isdigit() 也能辨識某些 Unicode 數字;如果輸入格式要求只能使用 ASCII 數字,請明確制定 ASCII 數字規則。句點是 Python 浮點數語法中的小數分隔符;像 "4,2" 這樣的字串不會被轉換為 4.2。如果資料採用特定地區的小數分隔符,應按照該輸入格式進行解析,不要在不加判斷的情況下取代標點符號。

手動編寫檢查邏輯時,必須明確規定如何處理這些情況,而且規則很容易偏離 Python 的浮點數語法。如果目標是接受 Python 能轉換的值,請使用 float() 並處理 ValueError。

value = "4546.4646"
print(value.isdigit())
print(float(value))
False
4546.4646