2016-10-06 16 views
-1

私は、郵便番号がK2S、1W3のように正しく書式設定されているかどうかを検証するGUIを使用してプログラムを書いています。しかし、私はK2S 1W3333333のようなものを入力しても、それはまだそれを検証します。ここに私のプログラムは次のとおりです。Javaカナダ郵便番号プログラム

 @Override 
     public void mouseClicked(MouseEvent arg0) { 
      String postal =txtInput.getText() ; 
      boolean error_found = false; 

      for (int j = 0; j < postal.length(); j++){ 

       //check if charAt j is a letter 
       if (j == 0 || j == 2 || j == 5){ 
        if (postal.charAt(j) >= 65 && postal.charAt(j) <= 90){ 
         ; 
        } 
        else 
         error_found = true; 

       }  
       //check if charAt j is a number 
       if(j == 1 || j == 4 || j == 6){ 
        if (postal.charAt(j) >= 48 && postal.charAt(j) <= 57){ 
         ; 

        } 
        else 
         error_found = true; 
       } 
      } 
      if (error_found == true){ 
       lblResult.setText("Error, please try again. Make sure your code is capital letters and numbers only and 6 characters. Ex: K2S 1W3"); 

      } 
      else 
      { 
       lblResult.setText("That code is valid!"); 
      } 
      } 
      }); 

}}

+0

正規表現の使用を検討しましたか?プログラミングに慣れていないようです。それがあなたの最善のアプローチです。これがクラス割り当てで正規表現を使用できない場合は、文字カウンタを維持する必要があります。 – mba12

+0

'> = 65'、' <= 90', '> = 48'、 '<= 57'はしないでください。それは意図を不明瞭にする。 '> = 'A''、' <= 'Z'', '> =' 0''、 '<= '9''を使用してください。 – Andreas

+0

@アンドレアス私は先生が私にそうしたいと思っています。 – JimmyJeans

答えて

1

パターンをチェックするための正規表現を使用しています。それはより簡単になります!例えば

[A-Z]{1}[0-9]{1}[A-Z]{1} 

KS2と1W3一致します(「」それの一部に必要とするかどうかを空白文字などを受け入れる場合、郵便番号の形式は、すなわちされてわからない!)をどちらか途中、正規表現は、移動するための方法です

は、あなたが正確に「KS2,1W3」の上に一致させる必要があると仮定EDIT

^[A-Z][0-9][A-Z],[0-9][A-Z][0-9]$ 

はそれを行う正規表現です

+0

私はまだ正規表現をやっているとは思わないが、とにかく感謝する!それは私の将来に役立つでしょう! – JimmyJeans

+0

[Wikipedia](https://en.wikipedia.org/wiki/Postal_codes_in_Canada)によれば、カンマではなく* space *で区切られています。また、Javaの 'matches()'メソッドを使用する場合、アンカー '^'と '$'は重複していることにも注意してください。 – Andreas

0

インデックスがこれらの値より大きい場合、ifステートメントはプログラムで実行されません。多くを変更することなくこれを修正する最も簡単な方法は、forの前にこれを追加することです。

if(postal.length() != 6)error_found = true; 

あなたが式にカンマを使用している場合は、正規表現を使用し、動作すること6.

から7作るが、最もエレガントな解決策ではありません。あなたがエラーを見つけたら、あなたがチェックすることキャッチすることができ

0

文字列、「K2S 1W3333333」を経由保管しないように、また、それをより効率的にbreakをしなければならなかったものを改善するために

固定ストリング長

Postal codes in Canadaのための基本的なルールのいくつかを読んだ後、以下のスニペット、特にライン

int len = postal.length(); 
if ((len == 7) && (postal.charAt(3) != ' ')) 

および/または...

} else if ((len != 6) && (len != 7)) { 

を参照してください、ここでの有効性をチェックし、迅速抜粋です

public class App { 
    public static boolean checkCode(String postal) { 
     if (postal == null || postal.isEmpty()) { 
      System.out.println("Empty postal code"); 
      return false; 
     } 
     int len = postal.length(); 
     if ((len == 7) && (postal.charAt(3) != ' ')) { 
      System.out.println("Invalid postal code length (7 characters requires space in middle of code)"); 
      return false; 
     } else if ((len != 6) && (len != 7)) { 
      System.out.println("Invalid postal code length (6 characters required)"); 
      return false; 
     } 
     if (len == 7) { 
      postal = postal.replace(" ", ""); 
      len = postal.length(); 
     } 
     final char[] invalidUpLetters = { 'D', 'F', 'I', 'O', 'Q', 'U' }; 
     final char[] invalidLowLetters = { 'd', 'f', 'i', 'o', 'q', 'u' }; 
     for (int i = 0; i < len; ++i) { 
      final char c = postal.charAt(i); 
      if (i % 2 == 0) { 
       if (!Character.isLetter(c)) { 
        System.out.println("Invalid letter at postal code string index: " + i); 
        return false; 
       } 
       for (int j = 0; j < invalidUpLetters.length; ++j) { 
        if ((c == invalidUpLetters[j]) || (c == invalidLowLetters[j])) { 
         System.out.println("Invalid letter used in postal code, string index: " + i); 
         return false; 
        } 
       } 
       if ((i == 0) && (c == 'W' || c == 'w' || c == 'Z' || c == 'z')) { 
        System.out.println("First position letter cannot be W or Z"); 
        return false; 
       } 
      } else if ((i % 2 == 1) && (!Character.isDigit(c))) { 
       System.out.println("Invalid digit at postal code string index: " + i); 
       return false; 
      } 
     } 
     return true; 
    } 
    public static void main(String[] args) { 
     args = new String[] { "K2S 1W3333333", "K2S 1W3", "K2S1W3" }; 
     System.out.println("is valid postal? " + (checkCode(args[0]) ? "Yes" : "No")); 
     System.out.println("is valid postal? " + (checkCode(args[1]) ? "Yes" : "No")); 
     System.out.println("is valid postal? " + (checkCode(args[2]) ? "Yes" : "No")); 
    } 
} 

これは、それぞれのインデックスの文字/数字をチェックするロジックと、最初の文字が有効であるかどうか、また文字すべて一緒に除外されるはずです。スニペットには、6桁の郵便番号の中央にスペースを追加するかどうかのチェックも含まれています。キャラクターには注意してください!

checkCode()メソッドからSystem.out.println()を削除し、ブール値を使用することもできます。これはデバッグの一部をクリアしてコードを読みやすくするのに役立ちます。シンプルさ(文字列が有効なカナダの郵便番号であるかどうかをチェックするメソッドを使用するだけでよい)

編集:元の投稿に記載されている「K2S、1W3」などの入力郵便番号のバリエーションが増えている場合は、スニペットに表示されているとおりに文字を正規化/解析することを検討してください。

乾杯