2010-08-17 193 views
16

我現在將一小段PHP代碼移植到java中,並且我依靠函數is_numeric($x)來確定$x是否是數字。在java中似乎沒有一個等價的函數,我對目前發現的當前解決方案並不滿意。最優雅的是java的數字()解決方案

我傾向於正則表達式的解決方案在這裏找到:http://rosettacode.org/wiki/Determine_if_a_string_is_numeric

我應該使用哪種方法,爲什麼?

+0

你的意思是什麼數字?你想要完全準確的PHP定義嗎? http://php.net/manual/en/function.is-numeric.php – 2010-08-17 21:37:39

+0

不必完全匹配PHP定義,但是如果它確實如此,那將是非常好的,因爲我知道我的算法適用於該函數。 – Doug 2010-08-17 21:46:30

回答

16

請注意,PHP isNumeric()函數將正確確定十六進制和科學記數法是數字,正則表達式方法鏈接到不會。

一個選項,特別是如果您已經在使用Apache Commons庫,則使用Commons-Lang的NumberUtils.isNumber()。它將處理PHP函數將處理的相同情況。

+0

這個函數看起來確實是我想要的,但是我沒有使用apache commons庫:( – Doug 2010-08-17 22:30:30

+3

@Doug Commons lang幾乎存在於所有的java程序中,它有助於*很多方面。下載它並添加它會給你的類路徑,你會很高興你做到了 – TheLQ 2010-08-17 23:26:26

+2

當你只需要一小段時間來決定添加一個庫是否合理時,總是很棘手的,但是如果你仔細研究一下它,很可能你會發現Apache Commons Lang可以給你其他的東西,你可以使用 - 它基本上是「應該內置到Java的東西,但不是」。我強烈推薦The Common Java Cookbook(http://www.discursive.com/ books/cjcook/reference/book-cjcook.html),它提供了很多關於使用Apache庫的技巧。 – 2010-08-18 13:22:25

1

你試過Integer.parseInt()嗎? (我不確定方法名稱,但Integer類有一個方法可以根據字符串創建一個Integer對象)。或者,如果您需要處理非整數數字,則類似的方法也可用於Double對象。如果這些失敗,則拋出異常。

如果您需要解析非常大的數字(大於int/double),並且不需要確切的值,那麼基於正則表達式的簡單方法可能就足夠了。

+2

如果您希望有一個非數字字符串的合理比例,則使用拋出的異常來查找它們都是不好的做法(非數字字符串不是「特例」),並且可能會導致性能問題。 – 2010-08-17 21:41:54

+0

這是真的。這取決於使用場景。 – 2010-08-18 09:32:26

2

在String中有一個數字通常是一個壞主意。如果你想使用這個數字,然後解析它並將其用作數字。您不需要「檢查」它是否是數字,或者您想將它用作數字。

如果你需要將其轉換,那麼你可以使用從Integer.parseInt(String)每一個解析器BigDecimal(String)

如果你只需要檢查的內容可以被看作是一個數字,那麼你可以逃脫正則表達式。

如果您的字符串可以包含浮點數,請不要使用parseInt。

+0

通常情況下,如果有人正在尋找一個isNumeric方法,他們血腥的並沒有把窮人編號放入字符串本身;) – Jostikas 2017-03-29 04:51:21

4

你看過使用StringUtils library? 有一個isNumeric()函數可能是你正在尋找的。 (請注意,「」將被評估爲真)

+0

Commons是數字函數只查找整數 - 它將拒絕,例如,包含一個數字小數點,當然不接受科學記數法。看到我的答案爲不同的Commons功能,似乎更接近您正在尋找。 – 2010-08-17 21:47:09

+0

@JacobM:的確,當我看到您的評論時,我看到了這個NumberUtils,並且正在更新我的答案。 – 2010-08-17 21:51:59

2

(可選)您也可以使用正則表達式。

if (theString.matches("((-|\\+)?[0-9]+(\\.[0-9]+)?)+"))) 
    return true; 

    return false; 
+0

最後一個'+'?'「-7.0-4.2」是什麼結果將返回true。 – Doug 2010-08-17 22:28:49

0

在強類型語言中,泛型isNumeric(String num)方法不是很有用。 13214384348934918434441是數字,但不適合大多數類型。許多那些合適的人不會返回相同的價值。

正如Colin指出的,不建議在攜帶應用程序的字符串中攜帶數字。 isNumberic函數只能用於接口方法的輸入數據。這些應該有比數字更精確的定義。其他人提供了各種解決方案正則表達式可用於一次測試多個條件,包括字符串長度。

0

只需使用 IF((X的instanceof號)

//如果檢查解析的數也

||(X的instanceof字符串& & x.matches(「(( - | \ +)?[0-9] +(\。[0-9] +)?)+「))

){ ... }
// ---所有數字類型,包括延伸的BigDecimal號碼

相關問題