La validation des numéros de téléphone est assez compliquée quand on souhaite gérer plusieurs pays. Pour pallier ce problème Google a sorti une librairie nommée LibPhoneNumber qui existe sur différents langages (c#, javascript, Java, etc). A travers ce billet nous allons voir quelques utilisations de cette fameuse librairie à travers un cas pratique.

La librairie :https://www.nuget.org/packages/libphonenumber-csharp
Le gitHub :https://github.com/googlei18n/libphonenumber
le GitHub de la solution :https://github.com/Lefanthome/ConsoleLibPhoneNumber

Rappel de la composition d’un numéro

Le numéro de téléphone permet d’identifier un terminal de façon unique au sein d’un réseau téléphone. Il permet de joindre une personne.
Ce numéro peut être composé de chiffres ou de lettres selon les pays.
Pour communiquer avec un autre pays on utilise son indicatif généralement accompagné de « + » que l’on ajoute comme préfixe au numéro de destination, ce numéro est dit international.

En France : 01 12 34 56 15, version international : +33 1 12 34 56 15

Cas Pratique

Pour mettre en pratique cette librairie, nous allons traiter la demande ci-dessous :

  • Autorisation de tous les pays avec le format international
  • Autorisation du format local en spécifiant à la librairie dans quel pays on se trouve
  • Quelle que soit la saisie du client (national ou international), on enregistre au format international avec +.

La Solution

La solution est télécharchage sur le GitHub (https://github.com/Lefanthome/ConsoleLibPhoneNumber), il s’agit d’une simple application console en .Net Core nommée « ConsoleLibPhoneNumber ».

Installation du package Nuget libphonenumber via l’interface :

nuget

Ou en ligne de commande dans la console de gestion des packages NuGet:

Install-Package libphonenumber-csharp -Version 8.8.8

Pour répondre à notre demande nous allons créer une classe Helper.

Cette classe contiendra 3 méthodes :

  • Validation d’un numéro de téléphone
  • Transformation du numéro au format international
  • Liste d’exemples de numéro de téléphone avec leur région et indicatif

La validation

Cette méthode vérifie simplement si le numéro de téléphone est valide. Elle permet de répondre au cas suivant :

  • La saisie : +351300502502 => on recherche l’indicatif (+351) pour faire une validation
  • La saisie : 00351300502502 => on remplace «00 » par un « + » puis on recherche l’indicatif pour faire une validation
  • La saisie : 300502502 + code région => on effectue une validation grâce au téléphone et le code région
public static bool IsValidPhoneNumber(string phoneNumber, string defaultRegion = "")
        {
            try
            {
                //Création de l'intance PhoneNumberUtil
                var util = PhoneNumberUtil.GetInstance();
                PhoneNumber number = null;
                //Si le numéro contient l'indicatif + ou le 00
                if (phoneNumber.StartsWith("+") || phoneNumber.StartsWith("00"))
                {
                    if (phoneNumber.StartsWith("00"))
                    {
                        phoneNumber = "+" + phoneNumber.Remove(0, 2);
                    }

                    number = util.Parse(phoneNumber, "");
                    // Récupération de la région au numéro avec l'indication +
                    string regionCode = util.GetRegionCodeForNumber(number);
                    // Validation du numéro qui correspond à la région trouvées
                    return util.IsValidNumberForRegion(number, regionCode);
                }
                else
                {
                    number = util.Parse(phoneNumber, defaultRegion);
                    // Validation du numéro sans indication mais avec le region code
                    return util.IsValidNumber(number);
                }
            }
            catch (NumberParseException)
            {
                //LOG
                return false;
            }
        }

Format International

La 2e méthode permet de mettre le numéro au format international quand on n’a pas l’indicatif mais uniquement le numéro de téléphone ainsi que le code de la région.

public static string FormatInternational(string phoneNumber, string regionCode)
        {
            if (string.IsNullOrEmpty(phoneNumber)) return string.Empty;

            PhoneNumber number = null;
            var util = PhoneNumberUtil.GetInstance();
            number = util.Parse(phoneNumber, regionCode);
            return util.Format(number, PhoneNumberFormat.INTERNATIONAL);
        }

Liste des régions supportées

La 3e méthode, permet d’avoir des informations de la liste des régions qui sont gérées par la librairie avec un numéro exemple et l’indicatif associé.

        public static List<(string RegionCode, string CountryCode, string PhoneNumber)> GetSupportedRegions()
        {
            var list = new List<(string RegionCode, string CountryCode, string PhoneNumber)>();
            var util = PhoneNumberUtil.GetInstance();
            var regions = util.GetSupportedRegions();

            foreach (var regionCode in regions)
            {
                var phoneNumber = util.GetExampleNumberForType(regionCode, PhoneNumberType.FIXED_LINE_OR_MOBILE);
                list.Add((regionCode, phoneNumber.CountryCode.ToString(), phoneNumber.NationalNumber.ToString()));
            }

            return list;
        }

Utilisation du Helper

Maintenant que nos méthodes sont créées nous allons pouvoir les utiliser, l’exemple ci-dessous nous montre les différentes utilisations de nos méthodes du Helper et permette de répondre à la demande.

static void Main(string[] args)
        {
            Console.WriteLine("PHONE NUMBER");

            Console.WriteLine("---------------------");
            Console.WriteLine("1-VALIDATION");
            Console.WriteLine($"Phone: 0800503020 - Region: FR - RESULT:{LibPhoneNumberHelper.IsValidPhoneNumber("0800503020", "FR")}");
            Console.WriteLine($"Phone: 0262990102 - Region: FR - RESULT:{LibPhoneNumberHelper.IsValidPhoneNumber("0262990102", "FR")}");
            Console.WriteLine($"Phone: +33647631289 - Region: FR - RESULT:{LibPhoneNumberHelper.IsValidPhoneNumber("+33647631289")}");

            Console.WriteLine("---------------------");
            Console.WriteLine("2-FORMAT INTERNATIONAL");
            Console.WriteLine($"Phone: 0800503020 - Region: FR - RESULT:{LibPhoneNumberHelper.FormatInternational("0800503020", "FR")}");

            Console.WriteLine("---------------------");
            Console.WriteLine("3-PHONE NUMBER REGION - 10 First");

            IEnumerable<(string RegionCode, string CountryCode, string PhoneNumber)> PhoneRegions = LibPhoneNumberHelper.GetSupportedRegions().Take(10);

            foreach(var phoneRegion in PhoneRegions)
            {
                Console.WriteLine($"Region Code: {phoneRegion.RegionCode} - Country Code: {phoneRegion.CountryCode} - Phone: {phoneRegion.PhoneNumber}");
            }
            Console.Read();
        }

Le résultat de l’application console :

resultatConsole

Bonus : Utilisation dans une application Asp.net Core.

En utilisant le Helper créé précédemment,il nous suffit simplement de créer un attribut qui hérite de ValidationAttribute et qui va utiliser notre Helper pour la validation. Ensuite il suffit d’ajouter cet attribut à une propriété de notre formulaire.

LibPhoneNumberAttribute

Nous pouvons aussi créer un attribut qui servira à valider le numéro de téléphone dans les formulaires

public class LibPhoneNumberAttribute : ValidationAttribute
{
   public string DefaultRegion { get; set; }
   public override bool IsValid(object value)
    {
      var phoneNumber = (string)value;
      if (string.IsNullOrEmpty(phoneNumber))
      {
         return true;
       }
      return LibPhoneNumberHelper.IsValidPhoneNumber(phoneNumber: phoneNumber, defaultRegion: DefaultRegion);
     }
}

ViewModel

Son utilisation dans le viewModel du formulaire

public class ContactFormModel
{
   [Required]
   [LibPhoneNumber(DefaultRegion = "FR", ErrorMessage = "Format invalide")]
   public string FirstName{ get; set; }

    [Required]
    public string LastName{ get; set; }

    [Required]
    public string Phone { get; set; }
}

Conclusion

Cette librairie est simple d’utilisation, régulièrement mise à jour, elle contient d’autres fonctionnalités que je n’ai pas abordées.
Maintenant vous pouvez valider vos numéros de téléphone sans aucun problème.

Ne ratez plus aucunes actualités avec la newsletter mensuelle de SoftFluent