2015-03-12 2 views
-1

Когда пользователь вводит свой идентификатор, я хочу, чтобы он был в определенном формате, они в основном объясняются в комментариях. Мне было интересно, был ли их более эффективный способ сделать это. Также, есть ли способ изменить введенные буквы на капитал так, как я сделал код, или любой другой метод.Улучшите мою проверку

private boolean setCustomerID(String id) { 
    //Validates the customerID contains 3 letters a hypthen then 4 numbers 
    if ((id.charAt(0) < 'A' || id.charAt(0) > 'Z') 
      || (id.charAt(1) < 'A' || id.charAt(1) > 'Z') 
      || (id.charAt(2) < 'A' || id.charAt(2) > 'Z') 
      || (id.charAt(3) != '-') 
      || !isDigit(id.charAt(4)) 
      || !isDigit(id.charAt(5)) 
      || !isDigit(id.charAt(6)) 
      || !isDigit(id.charAt(7))) { 
     return false; 
     //Checks the user enters P, B or C for first letter 
    } else if ((id.charAt(0) == 'P' || id.charAt(0) == 'B' || id.charAt(0) == 'E') 
      //Checks the second and third letter are in the correct region 
      && ((id.charAt(1) == 'S' && id.charAt(2) == 'C') 
      || (id.charAt(1) == 'S' && id.charAt(2) == 'C') 
      || (id.charAt(1) == 'W' && id.charAt(2) == 'A') 
      || (id.charAt(1) == 'N' && id.charAt(2) == 'I')  
      || (id.charAt(1) == 'N' && id.charAt(2) == 'E')  
      || (id.charAt(1) == 'N' && id.charAt(2) == 'W')  
      || (id.charAt(1) == 'M' && id.charAt(2) == 'I')  
      || (id.charAt(1) == 'E' && id.charAt(2) == 'A')  
      || (id.charAt(1) == 'S' && id.charAt(2) == 'E') 
      || (id.charAt(1) == 'S' && id.charAt(2) == 'W'))){ 
     // SC (Scotland), WA (Wales), NI (Northern Ireland), NE (North-East), NW (North-West), 
     //MI (Midlands), EA (East Anglia), SE (South-East), SW (South-West). 
     return true; 
    } 
     return false; 
    } 
+8

Два слова: регулярное выражение. – axiom

+2

@axiom У вас есть проблема? Используйте регулярное выражение. Тогда у вас будет две проблемы. :) –

+3

На самом деле довольно сложно выяснить правила проверки, просмотрев свой код. Можете ли вы изменить свой вопрос и описать их в тексте? –

ответ

7

Использование регулярного выражения.

private boolean matchCustomerID(String id) { 
    return id.matches("^[PBE](?:SC|WA|NI|NE|NW|MI|EA|SE|SW)-\\d{4}\\b"); 
} 
+3

Могу ли я предложить '^ [PBE] (NI | NE | NW | MI | EA | SE | SW) - [0-9] {4} \ b', чтобы строки, такие как' dPSE-1234' и 'PSE -12345' не ошибочно включены? –

+2

Кроме того, '\\ d' является предопределенной константой, которая может заменить' [0-9] '. –

0

Regexp это отличная возможность, но не так легко писать и понимать ..

В этом случае, я бы следовать своему пути, но я бы определил некоторый метод тестирования. Таким образом, код будет читабельным и простым в написании для него модульных тестов. Если вам потребуется некоторое изменение позже, вы поймете код.

Пример:

testForLength(); 
testForLetters(); 
testForFirstTwoLetters(); 
2

Регулярные выражения являются одним из способов решения этой проблемы. Вы можете составить шаблон таким образом, чтобы упростить обслуживание. Основываясь на rcorreia's pattern, вы можете сделать что-то вроде:

private boolean setCustomerID(String id) { 
    char[] validFirstLetters = { 'P', 'B', 'E' }; 
    String[] validRegions = { "SC", "WA", "NI", "NE", "NW", "MI", "EA", "SE", "SW" }; 

    String pattern = 
     String.format("^[%s](?:%s)-\\d{4}$", new String(validFirstLetters), 
      String.join("|", validRegions)); 

    return id.matches(pattern); 
} 

Обратите внимание, что это использует String.join() из Java 8. Если вы не используете Java-же, рассмотреть вопрос об использовании StringUtils из Apache Commons Lang.

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