2014-11-20 77 views
0

我試圖編寫一個方法,它接受一個形式爲「xxxx-xxxx」(x是任意數字1-9)的ID,並檢查輸入的ID是否有效。例如,1111-1111將是有效的,但111p-1111或11111-1111不會。然而,在我寫完這個方法之後,即使ID是111p-1111的形式,也是如此。java ID檢查方法

public static boolean idCheck(String ID){ 
    char[] idChar = ID.toCharArray(); 
    boolean firstHalf = false; 
    boolean secHalf = false; 
    for (int i = 0; i < 5; ++i){//Check first half 
     if ((idChar[i] > 47 && idChar[i] < 58)){//Checks ascii vals to see if valid ID 
      firstHalf = true; 
     } 
    } 

    for (int i = 5; i < idChar.length; ++i){//Check second half 
     if ((idChar[i] > 47 && idChar[i] < 58)){//Checks ascii vals to see if valid ID 
      secHalf = true; 
     } 
    } 

    //If all values are valid, returns true. 
    if (firstHalf == true && secHalf == true && idChar[4] == '-' && ID.length() == 9){ 
     return true; 
    } 

    return false; 
} 
+1

是的,這是因爲如果零件的一個包含一個數字,您將布爾變量設置爲true。最好的辦法是將firstHalf和secondHalf設置爲true,然後在for循環中,如果它不是數字,則將布爾變量設置爲false並打破循環。如果你熟悉正則表達式,你可以使用正則表達式匹配「匹配4位數--4位數」 – 2014-11-20 22:21:35

回答

1

您的if語句只查看一個數字以確定它是否將布爾值設置爲true。所以如果每個數字中的any都有效,布爾值將被設置爲true。

你可能使用正則表達式更好。 regexr.com是一個很好的入門資源! :)

喜歡的東西:

[1-9]{4}-[1-9]{4} (You can also use \d) 
2

使用正則表達式將是在這種情況下要簡單得多:

\d{4}-\d{4} 

在Java:

static boolean idCheck(String id) { 
    return id.matches("\\d{4}-\\d{4}"); 
} 

如果你不熟悉用正則表達式,這裏是一個解釋:

  • \d匹配一個數字0-9
    • {4}重複上次令牌4倍(匹配4位)
  • -匹配一個連字符字面
  • \d比賽一數字0-9
    • {4}重複上次令牌4倍(匹配4位)
0

你只檢查是否有匹配,如果沒有任何輸入的字符都沒有至少一個字符。

有一個快速的解決方案,是很容易理解的任何Java開發人員後,您可以使用正則表達式,並檢查您的輸入相匹配:

public static boolean idCheck(String id){ 
    return Pattern.matches("\\d{4}-\\d{4}", id); 
} 

如果你想保持你檢查,你應該的方式從trueboolean開始並檢查它們是否保持爲真。

boolean firstHalf = true; 
boolean secHalf = true; 

和由其使用firstHalf &= true爲您更新和使用else{ firstHalf = false; }分支。

要保持你的方法,我寧願永遠退了出去快,如果你知道結果:

public static boolean idCheck(String id) 
{ 
    //check length 
    if (id.length() != 9) 
     return false; 

    char[] idChar = id.toCharArray(); 
    //check for dash 
    if (idChar[4] != '-') 
     return false; 

    //check first half 
    for (int i = 0; i < 5; ++i) 
    { 
     if (!(idChar[i] > 47 && idChar[i] < 58)) 
      return false; 
    } 

    //check second half 
    for (int i = 5; i <= 10; ++i) 
    { 
     if (!(idChar[i] > 47 && idChar[i] < 58)) 
      return false; 
    } 
}