2010-03-31 12 views
5

Voici mon problème:téléphone java numéro validation

Créez un constructeur pour un numéro de téléphone d'une chaîne sous la forme xxx-xxx-xxxx ou xxx-xxxx pour un numéro local. Lève une exception si le format n'est pas valide. Je pensais donc à le valider en utilisant une expression régulière, mais je ne sais pas si je le fais correctement. Aussi quel genre d'exception aurais-je à jeter? Ai-je besoin de créer ma propre exception?

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; 
    } 

Salut désolé, oui ce sont les devoirs. Pour ces affectations, les seuls formats valides sont xxx-xxx-xxxx et xxx-xxxx, tous les autres formats (xxx) xxx-xxxx ou xxxxxxxxxx ne sont pas valides dans ce cas.

Je voudrais savoir si mon expression régulière est correcte

+4

est ce devoir? doivent être étiquetés en tant que telle, si oui ... – Brabster

+0

question évidente: Etes-vous sûr que votre format de numéro de téléphone attire une variété de numéro de téléphone que vos utilisateurs pourraient vouloir entrer? Rien n'est plus frustrant qu'un système à demi-intelligent qui refuse d'accepter des données parfaitement valables. (Oh, et si cela est seulement devoirs - jamais l'esprit.) – Tomalak

+0

Entièrement d'accord avec @Tomalak. S'il s'agit d'un système de production, la réponse correcte est de supprimer tous les caractères non numériques et de valider le résultat. –

Répondre

7

donc je pensais de valider à l'aide d'une expression régulière, mais je ne sais pas si je le fais correctement.

Il semble en effet trop compliqué. En outre, correspondant xxx-xxx-xxxx ou xxx-xxxxx est un chiffre peut être mieux fait avec "(\\d{3}-){1,2}\\d{4}". Pour en savoir plus sur regex, je recommande de passer par http://regular-expressions.info.

De plus, quel type d'exception dois-je lancer? Ai-je besoin de créer ma propre exception?

Un ValidatorException semble simple.

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

Si vous ne voulez pas créer un vous-même pour certaines raisons, je choisirais probablement IllegalArgumentException, mais encore, je ne recommande pas. Cela dit, cette validation ne couvre bien entendu pas les numéros de téléphone internationaux et/ou externes. À moins que ce soit vraiment des devoirs, je suggère de repenser la validation.

0

Vous pouvez faire correspondre ces motifs assez facilement comme suggéré par BalusC.

En remarque, StringTokenizer a été abandonnée. De JavaDoc:

StringTokenizer est une classe héritage qui est retenu pour des raisons de compatibilité, bien que son utilisation est déconseillée dans le nouveau code. Il est recommandé que toute personne recherchant cette fonctionnalité utilise à la place la méthode split de String ou le package java.util.regex.

Un moyen plus facile de diviser votre chaîne dans les segments appropriés seraient:

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}))$ 

matches: (0060) 123-12345678, (0060) 12312345678, (832) 123- 1234567, (006) 03-12345678,

(006) 03-12345678, 00603-12345678, 0060312345678

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

1234-5678, 01-123-4567

peut-elle remplacer '-' avec SPACE-à-dire (0080) 123 12345678

correspond également à + 82-123 -1234567, +82 123 1234567, +800 01 12345678 ... etc.

Plus de maison en attente/numéro privé. Pas pour 1-800-000-0000 type de numéro

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

+0

Veuillez lire la question au lieu du titre seulement. Ce n'est pas exactement ce que le PO demande. * « Ce Affectations le seul format valide sont xxx-xxx-xxxx et xxx-xxxx, tous les autres formats (xxx) xxx-xxxx ou xxxxxxxxxx ne sont pas valides dans ce cas. » * – BalusC

+0

Comme cela est la deuxième fois que vous faites , Je veux juste informer que Stack Overflow est un site de questions et réponses. Il n'est pas un forum de discussion où tout le monde à la recherche de la réponse exacte doit patauger dans un désordre de réponses répétées/surgénéralisé afin de trouver la réponse exacte que l'on cherche. – BalusC

+3

FYI, beaucoup de développeurs recherchent des réponses «similaires» mais pas exactes. J'essaie simplement de contribuer à la communauté afin qu'ils n'aient pas à parcourir d'autres sites pour trouver ce qu'ils veulent. Comme mon cas, je veux juste avoir une regex de validation complète et cette page m'a inspiré. Malgré pas directement répondu, mon poste au moins adapté au contexte. Il est difficile de chercher quelqu'un qui pose la même question. – peterong

-3

Chaîne pincode = "589877";

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

\ d indique les chiffres. à l'intérieur des accolades le nombre de chiffres Matcher matcher = pattern.matcher (PinCode);

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

Avez-vous lu la question? Ce n'est pas ce que OP demandait. – Syon

Questions connexes