HOWTO · Csharp

Formater une chaîne en tant que numéro de téléphone en C#

Dans cet article, explique comment formater une chaîne en tant que numéro de téléphone en C#.

Sur cette page

Le formatage d’un numéro de téléphone dépend de la nature de la valeur d’entrée. Si vous disposez d’une chaîne contenant un numéro, un formateur personnalisé peut supprimer les séparateurs et appliquer un motif d’affichage. Si l’indicatif régional et les autres parties sont déjà séparés, String.Format ou l’interpolation de chaînes permet de les assembler. Ces deux dernières approches ne découpent pas une chaîne de numéro de téléphone arbitraire et ne vérifient pas qu’elle correspond à un numéro valide.

Choisir une approche de formatage des numéros de téléphone en C#

Utilisez une méthode personnalisée lorsque l’entrée est une seule chaîne et que vous souhaitez normaliser sa ponctuation avant de l’afficher. L’exemple ci-dessous utilise le motif par défaut (##) ###-####, qui regroupe neuf chiffres en blocs de deux, trois et quatre chiffres. Modifiez ce motif selon la convention de numérotation requise par votre application : il s’agit d’un choix d’affichage, et non d’une norme universelle pour les numéros de téléphone.

Lorsque le numéro est déjà séparé en indicatif régional et en deux parties locales, utilisez String.Format ou l’interpolation pour insérer ces valeurs dans une chaîne. Ces méthodes conservent les parties fournies et ne déterminent ni comment les séparer ni comment les nettoyer. Aucune des deux ne valide les indicatifs de pays, les extensions ou la possibilité d’appeler le numéro obtenu.

Formater une chaîne en numéro de téléphone en C# avec une méthode personnalisée

La méthode formatPhNumber() accepte la chaîne d’entrée et un argument de format obligatoire. Passez string.Empty ou null pour utiliser le motif par défaut (##) ###-#### ; passez une autre chaîne de format numérique personnalisée .NET pour choisir un motif d’affichage différent. Avant le formatage, la méthode supprime les caractères qui ne sont pas des chiffres ASCII. Elle renvoie une chaîne vide si l’entrée ne contient aucun chiffre ASCII.

L’implémentation complète figure dans la dernière section. Ses opérations principales sont Regex.Replace(phoneNum ?? "", @"[^0-9]", string.Empty) et Convert.ToInt64(digits).ToString(phoneFormat). L’argument de format permet à l’appelant de modifier le motif d’affichage sans changer l’étape de nettoyage. Cette méthode convient à une convention d’affichage connue et de longueur fixe, mais pas à l’analyse générale des numéros internationaux.

Formater les parties d’un numéro de téléphone avec String.Format

String.Format("({0}) {1}-{2}", areaCode, firstPart, secondPart) place trois chaînes existantes aux positions indiquées. Par exemple, le premier argument remplit {0}, le deuxième {1} et le troisième {2}. Cette approche convient lorsqu’une autre partie de l’application a déjà analysé ou recueilli ces composants.

Les espaces réservés assemblent du texte ; ils ne suppriment pas la ponctuation, ne déduisent pas les limites entre composants et ne valident pas leur longueur. Validez chaque partie séparément si votre application exige un format précis. String.Format est le nom d’API employé ici ; cette API est disponible via System.String et s’appelle couramment string.Format dans du code C#.

Formater les parties d’un numéro de téléphone avec l’interpolation de chaînes

L’interpolation exprime directement le même assemblage : $"({areaCode}) {firstPart}-{secondPart}". Les expressions entre accolades sont insérées dans la chaîne qui les entoure. Cette syntaxe est concise lorsque les parties sont déjà stockées dans des variables nommées et a la même portée que String.Format : elle combine des valeurs, mais n’analyse ni ne valide une chaîne complète de numéro de téléphone.

Choisissez entre l’interpolation et String.Format selon la syntaxe la plus claire dans le contexte de votre code. Aucune des deux ne modifie les valeurs d’entrée ni n’applique automatiquement des règles relatives aux numéros de téléphone.

Limites du formateur personnalisé

Le formateur personnalisé traite volontairement l’entrée comme une suite de chiffres à afficher. Il ne conserve pas un zéro initial : la conversion des chiffres nettoyés en long les analyse comme un nombre, ce qui élimine le zéro initial avant le formatage. Si le nombre comporte plus de chiffres que Int64 ne peut en contenir, Convert.ToInt64 lève une OverflowException. La méthode suppose également que le format demandé convient au formatage numérique ; un format inadapté peut produire un résultat inattendu ou provoquer une erreur.

Pour les numéros de téléphone où les zéros initiaux sont importants, dont la longueur varie ou qui peuvent dépasser la plage de Int64, évitez de convertir les chiffres en entier. Conservez-les sous forme de texte et insérez les séparateurs selon une règle de longueur et de numérotation définie explicitement, ou utilisez une bibliothèque de gestion des numéros de téléphone si vous devez les analyser et les valider dans plusieurs régions. Intercepter les erreurs de conversion peut éviter l’arrêt de l’application, mais ne rend pas valide un numéro qui n’a pas été reconnu.

Exemple complet en C# et résultat

Exécutez cet exemple avec une entrée ordinaire de neuf chiffres. Il applique le motif d’affichage par défaut après avoir supprimé de l’entrée les séparateurs qui ne sont pas des chiffres.

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

using System;
using System.Text.RegularExpressions;

class PhoneFormatter
{
    public static string formatPhNumber(string phoneNum, string phoneFormat)
    {
        if (phoneFormat == null || phoneFormat.Length == 0)
        {
            phoneFormat = "(##) ###-####";
        }

        string digits = Regex.Replace(phoneNum ?? "", @"[^0-9]", "");
        if (digits.Length == 0)
        {
            return "";
        }

        return Convert.ToInt64(digits).ToString(phoneFormat);
    }

    static void Main()
    {
        string phoneNumber = "123456789";
        Console.WriteLine(formatPhNumber(phoneNumber, null));
    }
}
(12) 345-6789