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 :
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 :
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.