2017-07-04 6 views
0

J'essaie d'utiliser Number::Phone from CPAN pour accomplir 2 tâches:en utilisant le numéro :: téléphone pour valider le format et

  1. Valider un numéro de téléphone; et
  2. Mettre en forme le nombre en notation E.164.

Cependant, je suis incapable de comprendre comment cela fonctionne. Mon exemple de code est:

#!/usr/bin/perl -w 
use strict; 
use warnings; 
use Number::Phone; 

foreach my $fnum ('17888888', '97338888888', '00923455555333', '+97366767777' , '38383838') { 
    my $phone = Number::Phone->new($fnum); 
    my $norm = ""; 
    eval { 
     $norm = $phone->format_using('E123'); # or 'Raw' 
     print "E164 => '$norm'\n"; 
    } or do { 
     print STDERR "Unable to parse '$fnum'\n"; 
    } 
} 

Sortie prévue:

E164 => '+97317888888' 
E164 => '+97338888888' 
E164 => '+923455555333' 
E164 => '+97366767777' 
E164 => '+97338383838' 

Mais les résultats étaient incorrects. J'ai essayé d'utiliser Number::Phone::Normalize, mais toujours pas réussi:

#!/usr/bin/perl -w 
use strict; 
use warnings; 
use Number::Phone::Normalize; 

my %params = ( 
    'CountryCode'=>'973', 
    'IntlPrefix' =>'00', 
    'CountryCodeOut'=>'973', 
    'IntlPrefixOut' => '+', 
    ); 
my $nlz = Number::Phone::Normalize->new(%params); 

foreach my $number ('17888888', '97338888888', '00923455555333', '+97366767777' , '38383838') { 
    my $e164 = $nlz->intl($number); 
    print "E164 => '$e164'\n"; 
} 

avec le même résultat attendu:

E164 => '+97317888888' 
E164 => '+97338888888' 
E164 => '+923455555333' 
E164 => '+97366767777' 
E164 => '+97338383838' 

Cependant, ce produit des résultats erronés aussi. Le code Java de l'extrait ci-dessous fonctionne parfaitement, et c'est ce que j'essaie d'obtenir en Perl.

// Uses libphonenumber: http://code.google.com/p/libphonenumber/ 
// setenv CLASSPATH .:libphonenumber-8.5.2.jar 

// libphonenumber 
import com.google.i18n.phonenumbers.PhoneNumberUtil; 
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; 
import com.google.i18n.phonenumbers.NumberParseException; 
import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat; 

public class ValidateList { 
    public static void main(String[] args) { 
     try { 
      if (args.length != 1) { 
       throw new IllegalArgumentException("Invalid number of arguments."); 
      } 

      String file = args[0]; 
      PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); 

      try (java.io.BufferedReader br = new java.io.BufferedReader(new java.io.FileReader(file))) { 
       String line = null; 
       while ((line = br.readLine()) != null) { 

        try { 
         PhoneNumber phoneNumber = phoneUtil.parse(line, "BH"); 
         boolean isValid = phoneUtil.isValidNumber(phoneNumber); 
         if (isValid) { 
          System.out.println("E164 => " + phoneUtil.format(phoneNumber, PhoneNumberFormat.E164)); 
         } 
         else { 
          System.err.println("Invalid => " + line); 
         } 
        } 
        catch (NumberParseException e) { 
         System.err.println("NumberParseException for ("+line+"): " + e.toString()); 
        } 

       } 
      } 

     } 
     catch (Exception e) { 
      System.err.println(e); 
      System.err.println("Usage: java ValidateList <fileNameWithPhoneNumbers>"); 
     } 
    } 
} 
% cat input.txt 
17888888 
97338888888 
00923455555333 
+97366767777 
38383838 

% javac -cp libphonenumber-8.5.2.jar ValidateList.java 

% java -cp .:libphonenumber-8.5.2.jar ValidateList input.txt 
E164 => +97317888888 
E164 => +97338888888 
E164 => +923455555333 
E164 => +97366767777 
E164 => +97338383838 

Votre entrée est grandement appréciée.

+0

Que considérez-vous être correct? Veuillez fournir votre sortie attendue et la sortie actuelle. Les gens de Perl ici ne savent probablement pas comment lancer votre source Java, qui n'est même pas un [mcve] et ne contient aucun nombre. – simbabque

+0

Merci @simbabque J'ai modifié mon message pour être plus complet. –

+0

Et les gens Java ne peuvent pas répondre à votre question car il s'agit de Perl. Ne le marquez pas avec "java" si la question n'est pas * sur * java - c'est un tag non pertinent. –

Répondre

0

Quand je lance le premier exemple de code pour les numéros, deux d'entre eux ne parviennent pas à être analysé:

17888888 - cela est évident, lorsque le numéro d'appel :: Téléphone sans code de pays, ce ne sera pas analysée comme On ne sait pas de quel pays il s'agit

00923455555333 - 923 est, selon une recherche rapide sur google, le code du pays pour le Pakistan. La page Wikipedia pour les codes de numérotation au Pakistan ne montre pas 455, ce qui me conduit à penser que ce n'est pas un code régional connu pour Number :: Phone ou Wikipedia. Je soupçonne que c'est un nombre invalide. Donc, pour le premier numéro: spécifiez de quel pays il s'agit.

Si vous êtes certain que l'autre numéro est correct, vous en savez plus sur le développeur que Number :: Phone et je suis sûr qu'il sera heureux de recevoir votre contribution sous la forme d'un numéro plus complet :: Pack localisé de téléphone. Le fait que votre code Java accepte le nombre (probablement) invalide ne signifie pas nécessairement qu'il est plus correct, mais qu'il est moins pointilleux dans ce qu'il déclare être un nombre correct.

Edit:

demandé Téléphone :: Nombre d'analyser l'entrée « 923455555333 » au lieu de « 00923455555333 » conduit à la sortie désirée.

regardant la source de téléphone :: Numéro:

# ... processing input arguments 
$number = "+$number" unless($number =~ /^\+/); 

Il est clair que le 00 est interprété comme « +00 », puis rejeté comme étant un numéro non valide. View some discussion on that here

Il me semble que vous devrez gérer cela vous-même. Une façon peut être de simplement remplacer le début 00 par '+' - de préférence seulement si l'analyse échoue.

L'autre numéro peut être analysé si vous indiquez clairement à quel pays il devrait appartenir.

Peut-être comme ceci:

my $phone = Number::Phone->new($fnum); 
unless ($phone){ 
    $phone = Number::Phone->new('BH',$fnum); 
    if (!$phone && $fnum =~ s/^00/+/){ 
     # You should probably check the discussion I linked. 
     # There may well be problems with this approach! 
     $phone = Number::Phone->new($fnum); 
    } 
} 
+0

Merci @bytepusher pour votre réponse. Les deux nombres sont valides. Je suis censé utiliser un "Default Country" que je n'ai pas compris comment faire dans Number :: Phone. Voir (libphonenumber JavaScript Demo) 'https: // rawgit.com/googlei18n/libphonenumber/maître/javascript/i18n/phonenumbers/demo-compiled.html'. Pour le "Pays par défaut", utilisez "BH". Tous les numéros que j'ai fournis devraient être valides, et je les attends au format E.164 comme indiqué dans ma sortie attendue. –

+1

Je ne suis pas sûr d'où vient ce "pays par défaut" - je ne le vois pas mentionné dans la documentation. – bytepusher

+1

Je vous suggère comment vous pourriez aborder cela, après avoir découvert ce qu'est le vrai problème. Bonne chance! – bytepusher