2010-03-31 30 views
5

Ecco il mio problema:java numero di telefono convalida

Creare un costruttore per un numero di telefono data una stringa nella forma xxx-xxx-xxxx o xxx-xxxx per un numero locale. Genera un'eccezione se il formato non è valido.

Quindi stavo pensando di convalidarlo usando un'espressione regolare, ma non so se lo sto facendo correttamente. Inoltre che tipo di eccezione dovrei lanciare? Devo creare la mia eccezione?

public TelephoneNumber(String aString){ 
     if(isPhoneNumberValid(aString)==true){ 
      StringTokenizer tokens = new StringTokenizer("-"); 
      if(tokens.countTokens()==3){ 
       areaCode = Integer.parseInt(tokens.nextToken()); 
       exchangeCode = Integer.parseInt(tokens.nextToken()); 
       number = Integer.parseInt(tokens.nextToken()); 
      } 
      else if(tokens.countTokens()==2){ 
       exchangeCode = Integer.parseInt(tokens.nextToken()); 
       number = Integer.parseInt(tokens.nextToken()); 
      } 
      else{ 
       //throw an excemption here 
      } 
     } 

    } 


public static boolean isPhoneNumberValid(String phoneNumber){ 
    boolean isValid = false; 

    //Initialize reg ex for phone number. 
    String expression = "(\\d{3})(\\[-])(\\d{4})$"; 
    CharSequence inputStr = phoneNumber; 
    Pattern pattern = Pattern.compile(expression); 
    Matcher matcher = pattern.matcher(inputStr); 
    if(matcher.matches()){ 
     isValid = true; 
    } 
     return isValid; 
    } 

Ciao scusa, sì questo è compito. Per questo compito l'unico formato valido è xxx-xxx-xxxx e xxx-xxxx, tutti gli altri formati (xxx) xxx-xxxx o xxxxxxxxxx non sono validi in questo caso.

Vorrei sapere se la mia espressione regolare è corretta

+4

è questo compito? dovrebbe essere etichettato come tale se così ... – Brabster

+0

Domanda ovvia: sei sicuro che il tuo formato di numero di telefono intercetta qualsiasi numero di telefono che gli utenti potrebbero voler inserire? Niente è più frustrante di un sistema semi-intelligente che rifiuta di accettare dati perfettamente validi. (Oh, e se questo è solo compito a casa - non importa.) – Tomalak

+0

Completamente d'accordo con @Tomalak. Se si tratta di un sistema di produzione, la risposta corretta consiste nel rimuovere tutti i caratteri non numerici e convalidare il numero risultante. –

risposta

7

Stavo pensando di convalidare utilizzando un'espressione regolare, ma non so se sto facendo in modo corretto.

Sembra davvero complicato. Inoltre, l'abbinamento xxx-xxx-xxxx o xxx-xxxx dove x è una cifra può essere eseguita meglio con "(\\d{3}-){1,2}\\d{4}". Per ulteriori informazioni sulla regex, consiglio di passare allo http://regular-expressions.info.

Anche quale tipo di eccezione dovrei lanciare? Devo creare la mia eccezione?

A ValidatorException sembra semplice.

public static void isPhoneNumberValid(String phoneNumber) throws ValidatorException { 
    if (!phoneNumber.matches(regex)) { 
     throws ValidatorException("Invalid phone number"); 
    } 
} 

Se non si desidera creare uno voi stessi per qualche motivo, allora probabilmente sarei raccolgo IllegalArgumentException, ma ancora, non lo consiglio.

Detto questo, questa convalida ovviamente non copre i numeri di telefono internazionali e/o esterni. A meno che non si tratti davvero di compiti a casa, suggerirei di riconsiderare la convalida.

0

È possibile abbinare questi modelli abbastanza facilmente come suggerito da BalusC.

Come nota a margine, StringTokenizer è stato dichiarato obsoleto. Da JavaDoc:

StringTokenizer è una classe un'eredità che viene mantenuta per ragioni di compatibilità, anche se il suo uso è sconsigliato in nuovo codice. Si raccomanda che chiunque cerchi questa funzionalità utilizzi il metodo split di String o il pacchetto java.util.regex.

Un modo più semplice per dividere la stringa nei segmenti appropriato sarebbe:

String phoneParts[] = phoneNumber.split("-"); 
3
^(([(]?(\d{2,4})[)]?)|(\d{2,4})|([+1-9]+\d{1,2}))?[-\s]?(\d{2,3})?[-\s]?((\d{7,8})|(\d{3,4}[-\s]\d{3,4}))$ 

incontri: (0060) 123-12.345.678, (0060) 12.312.345,678 mila, (832) 123- 1234567, (006) 03-12.345.678,

(006) 03-12345678, 00.603-12.345.678, 0060312345678

0000-123-12345678, 0000-12-12 345678, 0000-1212345678 ... ecc

1234-5678, 01-123-4567

può sostituire '-' con SPACE cioè (0080) 123 12345678

corrisponde anche + 82-123 -1234567, +82 123 1234567, +800 01 12345678 ... ecc.

Altro per numero di casa/privato. Non per 1-800-000-0000 tipo di numero

*Tested with Regex tester http://regexpal.com/

+0

Si prega di leggere la domanda invece del solo titolo. Questo non è esattamente ciò che l'OP sta chiedendo. * "Per questi incarichi l'unico formato valido è xxx-xxx-xxxx e xxx-xxxx, tutti gli altri formati (xxx) xxx-xxxx o xxxxxxxxxx non sono validi in questo caso." * – BalusC

+0

Poiché questa è la seconda volta che stai facendo , Voglio solo informare che Stack Overflow è un sito di domande e risposte. Non è un forum di discussione in cui tutti quelli che cercano la risposta esatta devono guadare attraverso un pasticcio di risposte ripetute/overgeneralizzate per trovare la risposta esatta che si sta cercando. – BalusC

+3

FYI, molti sviluppatori stanno cercando risposte "simili" ma non esatte. Sto solo cercando di contribuire alla comunità in modo che non debbano guadare attraverso altre reti per cercare ciò che vogliono. Come il mio caso, voglio solo avere una regex di validazione completa e questa pagina mi ha ispirato. Nonostante non abbia risposto direttamente, il mio post almeno si adatta al contesto. È difficile cercare qualcuno che faccia la stessa domanda. – peterong

-3

String codice PIN = "589.877";

Pattern pattern = Pattern.compile("\\d{6}"); 

\ d indica le cifre. all'interno delle parentesi il numero di cifre Matcher matcher = pattern.matcher (codice PIN);

if (matcher.matches()) { 
     System.out.println("Pincode is Valid"); 
     return true; 
    } else { 
     System.out.println("pincode must be a 6 digit Number"); 
+2

Hai letto la domanda? Questo non è quello che l'OP stava chiedendo. – Syon

Problemi correlati