2017-11-03 1 views
-2

나는 방법을 사용하여 사용자에게 이름을 물어볼 연습을했습니다. 사용자가 텍스트를 입력하지 않으면 다시 질문해야합니다. 나는 그것을 작동 시켰지만 사용자가 숫자를 입력하면 여전히 인쇄됩니다. 사용자가 전화 번호를 입력하지 못하게하려면 어떻게해야합니까?사용자 입력이 숫자가 아닌 문자열임을 확인하는 방법

String str = "someting"; 
boolean isNumber = str.matches("\\d+");//return true if the input is a number 

또는 :

boolean isNotNumber = str.matches("[^\\d+]+");//return true if the input is not a number 
+1

Use'Integer.parseInt (String)'; –

+0

윌리엄 2와 같은 것을 허용해야합니까? –

+0

유효한 것으로 간주되는 값을 고려한 다음 이러한 조건을 테스트하는 방법을 만들어야합니다. 예를 들어 'J0e 8loggs'가 유효한 이름입니까? 검증 기준을 알고 나면 실행 가능한 솔루션을 선택할 수 있습니다. – Moob

답변

0

public static void main(String[] args) { 
    // call method 
    System.out.println("Hello " + getName()); 

} 

public static String getName() { 
    // input a scanner 
    Scanner scanner = new Scanner(System.in); 
    // declare vars 
    String userName = ""; 

    // while loop 
    while (userName.equals("")) { 
     // ask user for input 
     System.out.println("What is your name?"); 
     userName = scanner.nextLine(); 

    } 
    scanner.close(); 
    return userName; 

} 

아래에있는 내 코드}이다 정규식을 사용하십시오. 정규식은 일반적으로 느린으로

String namePattern = "[^\\p{P}|^\\d+]+"; 

//true if name contains only alphabets, false - otherwise 
boolean result = userName.matches(namePattern); 
+0

":; :"과 같은 입력은 어떻게됩니까? – denisq

+0

첫 번째 해결 방법은 두 번째로 true를 반환하고 이것이 논리 @denisq인데 어디에 문제가 있습니까? –

+0

여전히 구두점 문자를 허용합니다. – denisq

1

가장 좋은 방법에

다음은이 같은 일부 정규식과 일치를 사용할 수 있습니다

+0

왜' 'Scanner '가 이것을 검사하는'hasNext (pattern)'메쏘드를 가질 때 .matches()를 호출한다. –

0

, 비 정규식 솔루션은 다음과 같습니다

boolean containsDigit(final String string) { 
    boolean result = false; 

    if (string == null || string.isEmpty()) { 
     return result; 
    } 

    char[] characters = string.toCharArray(); 
    for (char character : characters) { 
     if (Character.isDigit(character)) { 
      result = true; 
      break; 
     } 
    } 

    return result; 
} 

이 다음 동안 루프

while (userName.equals("") || containsDigit(userName)) { 
    ... 
} 

참고가 발생합니다 : 깨끗한 대안 것 대신 username.equals("")

+0

'Scanner '가 다음 행이'int'인지 검사하는 hasNextInt() 메소드가있을 때 weel을 재 작성해야하는 이유는 무엇입니까? –

+0

왜냐하면'Scanner # hasNextInt()'는 * next line *을 체크하지 않고 * next token *을 체크하기 때문입니다. 이것은'943320'에서'true'를 올바르게 반환 할 것이지만'John 69'에서는 틀리게 false를 반환한다는 것을 의미합니다. – Synch

0

우물대신 username.isEmpty()을 사용하십시오.에는 사용자 입력을 처리하는 여러 가지 방법이 있습니다. 당신이 사용자 입력이 int 있는지 확인하는 데 사용할 수있는 방법 중 하나는 hasNextInt()입니다 :

반환 사실이 스캐너의 입력 내의 다음의 토큰을 사용하여 지정된 기수에 근거하는 int 값으로 해석 될 수있는 경우 nextInt() 메서드.

그래서 코드는 다음과 같습니다

if(!scanner.hasNextInt()){ 
    userName = scanner.nextLine(); 
} 

또 다른 방법은 알파벳 문자열과 일치하는 패턴 hasNext(Pattern) 방법을 사용하는 것입니다.

0

가능하다면 ApacheCommons과 같은 타사 라이브러리를 사용하고 StringUtils.isAlpha() 메서드를 사용할 수도 있습니다.

isAlpha() 메서드는 제공된 문자열이 null이거나 비어 있는지 또한 확인합니다.

관련 문제