[英]Is StringUtils.isNumeric() method specification logically correct?
Apache 的StringUtils.isNumeric()
方法規范說:
檢查字符串是否僅包含 unicode 數字。 小數點不是 unicode 數字並返回false
。 Null
將返回false
。 空String ("")
將返回true
。
這在邏輯上是對的嗎? 為什么他們將空字符串視為數字?
該行為在 3.0 中發生了變化。 來自Commons Lang 3.0 的新內容? :
StringUtils.isAlpha、isNumeric 和 isAlphanumeric 現在在傳遞空字符串時都返回 false。 以前他們返回true。
保留下面的舊答案,供參考和 3.0 之前的用戶使用。
這在邏輯上是對的嗎?
我們有
在這種情況下,1 和 2 彼此一致; 空字符串中的所有字符都是 unicode 數字。 (或者等效地,空字符串中的任何字符都不是unicode 數字。)這就是邏輯學家所說的空洞的真實和有點違反直覺的東西。 這就像說我公寓里的所有大象都是綠色的。 這是真的,因為我的公寓里沒有大象。
但是,第 3 項(方法的名稱)自然會被解釋為如果給定的字符串表示數字則返回 true 的方法。
因此,要么是文檔和實現錯誤,要么是命名錯誤。 對此沒有正確或錯誤的答案。
為什么他們將空字符串視為數字?
雖然該方法的名稱可能會讓您相信該方法應該只對表示數字的字符串返回 true,但規范實際上說如果字符串只包含 unicode 數字,它應該返回 true。
你說,
我很困惑,因為規范說:“檢查字符串是否只包含 unicode 數字。” 我沒有看到“”包含數字....
請注意,空字符串不包含除 unicode 數字以外的任何內容。 因此該方法返回true。
java.lang.Integer.parseInt("")
會失敗。
這不是邏輯問題。 這也不是常識問題 - 沒有任何數字是沒有符號表示的。 沒有強有力的論據為什么空字符串應該代表 0。
如果方法名稱是containsOnlyNumeric()
,根據我們的數學教科書,很自然地為 "" 返回 true。 但是,方法名稱是isNumeric()
,對 "" 的處理並不自然。 此外,沒有明顯的理由為什么null
應該返回 false。 我會為空拋出異常。
但事實就是如此,它有據可查,您還能要求什么?
不僅僅是我問了這個問題:) 人們在 Apache 的 Jira 中打開了這個缺陷: https : //issues.apache.org/jira/browse/LANG-428
他們關閉而不修復它只是為了保持向后兼容性(遵循方法規范)。
但是大家一致認為方法的當前行為是錯誤的。
首先檢查字符串是否為空()的條件。
if(StringUtils.isNotEmpty(str) && StringUtils.isNumeric(str)) {
}
那么你的問題就解決了。
但還有一個問題是你傳遞了負值,比如
str = "-1";
StringUtils.isNumeric(str)
它將是假的。
您需要注意這種情況。
還有另一種解決方案。 NumberUtils.isNumber這將檢查它是否是 Long、Double 或 Integer 的數字。
希望這有幫助
從 Commons Lang 3.5 開始, NumberUtils.isCreatable是實現此目的的方法。 有關更詳細的說明,請參閱此答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.