2016-10-06 2 views
-1

Я пишу программу с использованием gui, которая будет проверять правильность формирования почтового кода, например K2S, 1W3. Но, если я ввожу что-то вроде 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

@ Аndreas Я бы хотел, но учитель хочет, чтобы я сделал это таким образом. – JimmyJeans

ответ

1

использовать регулярное выражение для проверки моделей. Это будет проще!

, например

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

будет соответствовать KS2 и 1W3 (не уверен, что формат почтового индекса будет, т.е. если «» должен частью этого или нет, если вы принимаете символ пробела и т.д.!) В любом образом, регулярные выражения путь

EDIT предположим, что вы должны точно соответствовать выше «KS2,1W3», то

^[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), они разделяются * пробелом *, а не запятой. Также обратите внимание, что при использовании методов 'match()' Java якоря '^' и '$' являются избыточными. – Andreas

0

Проблема в том, что операторы if не будут выполняться в вашей программе, если индекс больше этих значений. Самый простой способ исправить это, не меняя многого, - это добавить это перед оператором for.

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

Если у вас есть запятая в выражении сделать это 7 из 6.

Это будет работать, но это не самое элегантное решение, использовать регулярное выражение.

Для того, чтобы улучшить то, что вы должны были сделать его более эффективным, а также break как только вы нашли ошибку, так что вы не продолжайте идти через

0

Строка «K2S 1W3333333» может быть перехвачено проверять на фиксированная длина строки. Смотрите ниже фрагмент кода, в частности, линии

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

и/или ...

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

После прочтения некоторых основных правил Postal codes in Canada, вот быстрый фрагмент, который проверяет на валидность:

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-значного почтового индекса или нет. Будьте осторожны с персонажами!

Вы также можете удалить System.out.println() из метода checkCode() и придерживаться метода booleans - это поможет очистить часть отладки и упростить чтение кода - ради простота (просто нужно использовать метод, чтобы проверить, является ли строка допустимым почтовым индексом Канады или нет).

Редактировать: Если вы получаете больше вариантов ввода почтовых индексов, таких как «K2S, 1W3», как указано в исходном посте, рассмотрите возможность нормализации/разбора символов, как показано в моем фрагменте, чтобы более легко прочитать почтовые индексы.

Cheers

Смежные вопросы