Question

Dans mon application C #, j'utilise une expression régulière pour valider le format de base d'un numéro de téléphone américain afin de m'assurer que l'utilisateur ne se contente pas d'entrer des données erronées. Ensuite, je supprime tout sauf les chiffres, donc ceci:

  

(123) 456-7890 x 1234

devient

  

12345678901234

dans la base de données. Toutefois, dans différentes parties de mon application, je souhaite reconvertir ce numéro de téléphone normalisé en

.
  

(123) 456-7890 x 1234

Quelle est la meilleure façon de faire une telle chose? (Au fait, ne vous inquiétez pas de la comptabilisation des formats de numéros de téléphone internationaux.)

Était-ce utile?

La solution

String.Format("{0:(###) ###-#### x ###}", double.Parse("1234567890123"))

résultera en (123) 456-7890 x 123

Autres conseils

En utilisant une expression rationnelle, vous pouvez remplacer:

(\d{3})(\d{3})(\d{4})(\d{4})

avec:

(\1) \2-\3 x\4

(Bien que je ne connaisse pas les numéros de téléphone américains, il y a peut-être plus que cela.)

Je voudrais simplement utiliser une chaîne de format personnalisé pour reconvertir le nombre en chaîne:

class Program
{
    static void Main(string[] args)
    {
        long phoneNumber = 12345678901234;
        string phoneNumberString = String.Format("{0:(000) 000-0000 x0000}", phoneNumber);
        Console.WriteLine(phoneNumberString);
    }
}

Bien sûr, vous voudriez l’intégrer dans une fonction qui prendrait le numéro de téléphone en long, puis renverrait la chaîne (avec le format chargé ou stocké en tant que constante dans la méthode, ou quelque chose d’adéquat à votre situation).

Oh, et si vous l’avez dans une chaîne et pas longtemps, vous pouvez facilement convertir la chaîne en chaîne longue, puis la transmettre à la fonction de formatage. Bien sûr, il y a des considérations de performance ici si vous le faites de manière répétée (puisque vous répétez la chaîne pour créer le long, puis que vous la reconvertissez en chaîne lorsque vous pouvez simplement utiliser une sous-chaîne).

Si vous ne prenez en charge que les numéros américains, vous pouvez simplement formater les chiffres pour qu'ils affichent des parenthèses et x où vous le souhaitez.

Je préférerais stocker la totalité de la chaîne. Je l’analyserais à l’aide d’une expression rationnelle pour la valider, puis je la stockerais dans une chaîne normalisée.

Pour lui faire accepter n'importe quel pays, je voudrais faire ceci:

Je voudrais ajouter le code IDD à tous les numéros de téléphone, puis le masquer des utilisateurs de ce pays.

so: (123) 456-7890 x1234 serait stocké sous le numéro +1 (123) 456-7890 x1234

La regex (compatible perl) ressemblerait à quelque chose comme (complètement non testé et ne fonctionnerait pas):

(+ \ d +)? \ s + (((\ d {, 3})) (? \ s + ([-. 0-9] {6,}) \ s + ((x | ext \ w *) \ d {, 4})

  • Ceci est un nombre optionnel de chiffres précédé de +
  • suivi d'un ou plusieurs espaces
  • Ensuite, un groupe facultatif de 3 chiffres maximum entre parenthèses
  • Puis un ou plusieurs espaces
  • Ensuite, un groupe de 6 chiffres ou plus, des tirets ou des points
  • Puis un ou plusieurs espaces
  • Ensuite, un x optionnel ou un mot commençant par ext (ext, extension ...) et un groupe de 4 chiffres maximum

J'aurais une base de données d'utilisateurs comprenant l'indicatif de pays et d'indicatif régional, que je remplirais automatiquement en cas d'absence. Le pays aurait sa convention de regroupement des chiffres par défaut pour les numéros de téléphone (3,4 pour les États-Unis).

  • Ainsi, si vous vous trouvez dans la zone 123 aux États-Unis et entrez 456.7890, il sera analysé comme suit: +1 (123) 4567890 et vous ne le verriez que comme suit: 456-7890
  • si vous vous trouvez au Qatar et entrez le numéro 4444555 extenshn 33, il est enregistré sous le numéro +974 4444555 x33, vous le verrez ainsi sous le numéro 4444555 x33

L'indicatif international ne sera pas affiché pour les utilisateurs du même pays, ni l'indicatif régional pour les utilisateurs du même pays ou de l'indicatif régional. Le numéro complet serait affiché au-dessus de la souris (étiquette HTML?)

Devez-vous ventiler la DB? Sinon, ne le faites pas. Si vous DEVEZ le faire, vous pouvez alors stocker les différentes pièces dans des champs différents (indicatif régional, préfixe, numéro d'abonné, extension).

Ou, extrayez le nombre et commencez l'analyse. Si ce n'est que 10 chiffres, alors vous savez qu'il n'y a pas d'extension. Tous les chiffres après 10, les coller dans la chaîne après un 'x' ou quelque chose.

J’ai fait quelque chose de similaire dans une application C ++. J’ai écrit les différents mécanismes de contact stockés sous forme de chaîne unique, mais j’ai inversé ce que vous faisiez. J'ai sorti les champs d'une boîte de dialogue et construit le numéro formaté à stocker sous forme de chaîne.

Voici une méthode d'extension qui pourrait aider:

public static string InsertStringAtPositions(this string str, string insertStr, IEnumerable<int> positions)
{
    if (str != null && insertStr != null && positions != null)
    {
        string newString = string.Empty;
        int previousPos = 0;
        foreach (var pos in positions)
        {
            if (pos < str.Length)
            {
                newString += str.Substring(previousPos, pos - previousPos) + insertStr;
                previousPos = pos;
            }
        }
        if (positions.Last() < str.Length)
        {
            return newString + str.Substring(positions.Last(), str.Length - positions.Last());
        }
        return newString;
    }
    return str;
}

Utilisation:

// Will convert "0399998888" to "03 9999 8888"
number.InsertStringAtPositions(" ", new[] {2, 6});
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top