2014-01-27 86 views
2

我想檢查是否高度有效。要有效必須是1或1.4或1.0或1等它不能是別的像一個字符串,數字或十進制旁邊的任何字符。小數不能在字符串的開頭,它只能有1個小數。正在嘗試的正則表達式是:正則表達式查找int或雙

"/^[0-9]+([\\,\\.][0-9]+)?$/" 

但它不工作,仍然接受字符串。任何幫助將是偉大的,謝謝!

public static boolean HeightValid(String height) 
{ 
     boolean isHeightValid = true; 


     if(!height.matches("/^[0-9]+([\\,\\.][0-9]+)?$/") || height.length() < 1 || height.length() > 9) 
      { 
      isHeightValid = false; 
      } 
     else 
      { 
      double doubleHeight = Double.parseDouble(height); 
      DecimalFormat df = new DecimalFormat("#.00"); 
      String decHeight = df.format(doubleHeight); 
      heightField.setText(decHeight); 

      } 

    return isHeightValid; 
    } 

如果您需要任何更多的信息,只是添加評論,謝謝

+0

爲什麼你會使用一個正則表達式的呢? – Johnsyweb

+5

你爲什麼要使用正則表達式?這不是真的。如果你想查看一個字符串是否是一個int,使用一個內置的int解析函數。如果您想查看它是否是雙精度型,請使用雙解析函數。放下巧克力覆蓋的香蕉,遠離歐洲貨幣體系。 [另見。](http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/put-down-the-chocolate-covered-banana.html)(編輯:我誤以爲是C#,durp。評論仍然存在雖然,只是不是功能的名稱。) – neminem

+0

另外,可能的幫助:http://stackoverflow.com/questions/8391979/does-java-have-a-int-tryparse-that-doesnt-throw- an-exception-for-bad-data – neminem

回答

2

任何理由,你爲什麼要使用正則表達式?你可以嘗試使用來自http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#parseDouble(java.lang.String的Double.parseDouble()

然後如果格式不正確以處理用戶輸入錯誤的方式捕獲NumberFormatException。

編輯:我沒有看過所有的代碼開始。你可以擺脫第一if語句,做一個try-catch上Double.parseDouble(height)如果達到你知道它沒有成功catch塊。

1

這應該這樣做:

"^[0-9]+([,.][0-9]?)?$" 

編輯:我刪除了斜線。我發現這裏發佈的所有其他模式都存在缺陷。你不需要轉義[]內的字符 - 除了]。這個問題沒有限制小數點分隔符之前的位數。但它只允許在小數點後一位。

+0

斜線是錯誤的。 – ajb

+0

@ajb - Java中沒有正則表達式分隔符? – sln

+0

@sln正確。看到我的答案。 – ajb

2

這是不錯的使用之前嘗試正則表達式,這個網站是相當直觀: https://www.debuggex.com/

我想你應該去:(|)?^ [0-9] + [0-9 ] $

這就是說,neminem和Johnsyweb是正確的,你不必使用正則表達式這個

2

只是想指出的是,使用正則表達式可以有一些缺陷,如

接受這些:0,00,0

但不接受1,000.00

一個很好的正則表達式是很難寫。

對於簡單的情況下是這樣,使用Double.parseDouble()和一個try-catch塊如所提到的將是更合適的其他。

+2

請注意'Double.parseDouble()'也不會接受'「1,000.00」'。這是每個人都回答的缺陷,暗示使用其中一個解析函數而不是正則表達式。它不允許OP可能想要接受的可能格式,但內置的解析函數不會(例如用逗號輸入)。 – ajb

1

我必須使用try,再次抓住..

  try 
      { 
      double doubleHeight = Double.parseDouble(height); 
      DecimalFormat df = new DecimalFormat("#.00"); 
      String decHeight = df.format(doubleHeight); 
      if(decHeight.charAt(0)=='.') 
      { 
       decHeight = "0" + decHeight; 
      } 

      } 

     catch(NumberFormatException e) 
     {   
      isHeightValid = false;    
     } 
+1

我只是把* try'..'catch'放在第一個語句*。或者改變'catch'只捕獲'NumberFormatException',而不是所有的'Exception's。您編寫它的方式,如果其他代碼中存在錯誤並且出錯,則該方法會報告(錯誤地)輸入無效,而不是傾銷堆棧跟蹤,以幫助您找出您的位置代碼是錯誤的。 – ajb

1

你真的需要輸入字符串包含斜槓(/字符)?如果沒有,請將它們從正則表達式中移除。 Perl和JavaScript中使用斜線字符表示一個「正則表達式文本」,這是內置到這些語言的模式匹配的東西。 Java沒有正則表達式文字;正則表達式模式是從普通的字符串文字創建的。因此斜槓不被使用,如果你把它放在正則表達式中,它假定你真的想匹配一個斜線。

+0

爲什麼downvote? – ajb

1

您所需要的正則表達式是這一個:

^[0-9]+([\\,\\.][0-9]+)?$ 

測試它,它的工作原理。

1

可以讓你開始 -
編輯了分隔符

# "^(?:[1-9]\\d{0,2}(?:,\\d{3})*(?:[.]\\d*)?|\\d+[.]?\\d*)$" 

^ 
(?: 
     [1-9] 
     \d{0,2} 
     (?: 
      , \d{3} 
    )* 
     (?: 
      [.] \d* 
    )? 
    | 
     \d+ [.]? \d* 
) 
$ 

相同,但更加緊湊的格式 -

^
(?: 
     [1-9] \d{0,2} 
     (?: , \d{3})* 
     (?: [.] \d*)? 
    | 
     \d+ [.]? \d* 
) 
$