6 votes

String.Format Numéros de téléphone avec extension

J'essaie de créer une fonction qui formate les numéros de téléphone américains, en espérant ne pas avoir à parcourir chaque chiffre en boucle.

Lorsque 10 chiffres sont introduits, tout va bien. Cependant, lorsque plus de 10 chiffres sont entrés, le problème se pose. Je veux que la méthode String.Format ajoute les chiffres de l'extension sur la droite. Par exemple :

Lorsque 14 chiffres sont entrés, le résultat devrait être :(444)555-2222 x8888 Si l'on introduit 12 chiffres, le résultat devrait être :(444)555-2222 x8888 etc. Cependant, le résultat que j'obtiens avec ma tentative actuelle est le suivant : En passant par 12 chiffres, on obtient cette chaîne '() -949 x555444433'.

Voici ce que j'ai jusqu'à présent.

public static string _FormatPhone(object phonevalue)
{
    Int64 phoneDigits;

    if (Int64.TryParse(phonevalue.ToString(), out phoneDigits))
    {
        string cleanPhoneDigits = phoneDigits.ToString();
        int digitCount = cleanPhoneDigits.Length;

        if (digitCount == 10)
            return String.Format("{0:(###) ###-####}", phoneDigits);
        else if (digitCount > 10)
            return String.Format("{0:(###) ###-#### x#########}", phoneDigits);
        else
            return cleanPhoneDigits;
    }

    return "Format Err#";
}

Merci d'avance.

2voto

Ax. Points 357

Je pense que vous devrez diviser votre chaîne phoneDigits entre les 10 premiers chiffres et le reste.

//[snip]
else if (phoneDigits.ToString().Length > 10)
        {
            return String.Format("{0:(###) ###-#### x}{1}", phoneDigits.Substring(0,10), phoneDigits.Substring(10) );
        }
//[snip]

1voto

Steven Sudit Points 13793

Je suggère de le traiter comme une chaîne de chiffres, pas comme un numéro. Vous pourriez alors utiliser Substring explicitement pour séparer les parties.

1voto

Pete Points 137

En essayant de le faire tenir en une ligne, j'ai trouvé ça.

var phoneNumber = "(999) 555-4455 ext123";
phoneNumber = Regex.Replace(phoneNumber, "(.*?)([+]\\d{1,3})?(.*?)(\\d{3})(.*?)(\\d{3})(.*?)(\\d{4})([ ]+)?(x|ext)?(.*?)(\\d{2,5})?(.*?)$", "$2 $4 $6 $8 $10$12").Trim().Replace("ext","x");

S'il commence par +#, il le laissera tranquille. Il cherchera ensuite des blocs de chiffres. 3,3,4 puis il cherche ext ou x pour extension et encore 2-5 chiffres. À ce stade, vous pouvez le formater comme vous le souhaitez, j'ai choisi les espaces.

1234567890 -> '123 456 7890'

(123)456.7890 -> '123 456 7890'

+1 (999)555-4455 ext123 -> "+1 999 555 4455 x123".

0voto

Jason Evans Points 15732

Essayez d'utiliser des expressions régulières :

class Program
    {
        static void Main(string[] args)
        {
            var g = FormatUSPhone("444555222234");

        }

        public static string FormatUSPhone(string num)
        {
            string results = string.Empty;

            if(num.Length == 10)
            {
                num = num.Replace("(", "").Replace(")", "").Replace("-", "");
                const string formatPattern = @"(\d{3})(\d{3})(\d{4})";

                results = Regex.Replace(num, formatPattern, "($1) $2-$3");

            }else if (num.Length == 12)
            {
                num = num.Replace("(", "").Replace(")", "").Replace("-", "");
                const string formatPattern = @"(\d{3})(\d{3})(\d{4})(\d{2})";

                results = Regex.Replace(num, formatPattern, "($1) $2-$3 x$4");
            }

            return results;
        }

J'ai modifié le texte ci-dessus à partir d'un exemple que j'ai trouvé aquí . Jouez avec le code ci-dessus, voyez si cela vous aide.

0voto

Ray Points 12711

En utilisant une regex :

Regex usPhoneRegex = new Regex(@"(\d{3})(\d{3})(\d{4})(.*)", RegexOptions.IgnoreCase | RegexOptions.Compiled);
string USPhoneFormatString = "$1-$2-$3 x$4";
return usPhoneRegex.Replace("312588230012999", USPhoneFormatString));

Tout ce qui suit le numéro de téléphone principal sera renvoyé comme une extension.

Puisque vous avez utilisé un int64 dans votre code, ma regex suppose qu'il n'y a pas d'espace ou de ponctuation dans le numéro de téléphone.

-- Editer -- Ahmad m'a fait remarquer que je ne traitais pas le cas d'un numéro sans extension. Voici donc une version révisée qui utilise un MatchEvaluator pour faire le travail. Est-elle meilleure que les autres réponses ? Je ne sais pas, mais c'est une approche différente et je me suis dit que j'allais la proposer.

Regex usPhoneRegex = new Regex(@"(\d{3})(\d{3})(\d{4})(.*)", RegexOptions.IgnoreCase | RegexOptions.Compiled);
return usPhoneRegex.Replace("3125882300", new MatchEvaluator(MyClass.formatPhone))

public static string formatPhone(Match m) {
  int groupIndex = 0;
  string results = string.Empty;
  foreach (Group g in m.Groups) {
    groupIndex +=1;
    switch (groupIndex) {
      case 2 : 
        results = g.Value;
        break;
      case 3 : 
      case 4 : 
        results += "-" + g.Value;
        break;
      case 5 :
        if (g.Value.Length != 0) {
          results += " x " + g.Value;
        }
        break;
    }
  }
  return results;
}

Cela devrait probablement utiliser un StringBuilder.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X