Question

Ajout rapide dans notre projet. Un champ de notre base de données contenant un numéro de téléphone ne doit comporter que 10 caractères. Donc, si je suis passé au (913) -444-5555 " ou autre chose, existe-t-il un moyen rapide d'exécuter une chaîne à l'aide d'une sorte de fonction de remplacement spéciale que je peux lui transmettre à l'aide d'un jeu de caractères?

Regex?

Était-ce utile?

La solution

Certainement regex:

string CleanPhone(string phone)
{
    Regex digitsOnly = new Regex(@"[^\d]");   
    return digitsOnly.Replace(phone, "");
}

ou dans une classe pour éviter de recréer l'expression régulière tout le temps:

private static Regex digitsOnly = new Regex(@"[^\d]");   

public static string CleanPhone(string phone)
{
    return digitsOnly.Replace(phone, "");
}

En fonction de vos entrées dans le monde réel, vous souhaiterez peut-être une logique supplémentaire pour effectuer des opérations telles que la suppression des 1 (pour les appels longue distance) ou tout ce qui se trouve derrière un x ou un X (pour les extensions).

Autres conseils

Vous pouvez le faire facilement avec regex:

string subject = "(913)-444-5555";
string result = Regex.Replace(subject, "[^0-9]", ""); // result = "9134445555"

Vous n'avez pas besoin d'utiliser Regex.

phone = new String(phone.Where(c => char.IsDigit(c)).ToArray())

Voici la méthode de la méthode d'extension pour le faire.

public static class Extensions
{
    public static string ToDigitsOnly(this string input)
    {
        Regex digitsOnly = new Regex(@"[^\d]");
        return digitsOnly.Replace(input, "");
    }
}

L'utilisation des méthodes Regex dans .NET devrait vous permettre de faire correspondre tout chiffre non numérique à l'aide de \ D, comme suit:

phoneNumber  = Regex.Replace(phoneNumber, "\D", "");

Qu'en est-il d'une méthode d'extension qui n'utilise pas de regex.

Si vous vous en tenez à l'une des options de Regex, utilisez au moins RegexOptions.Compiled dans la variable statique.

public static string ToDigitsOnly(this string input)
{
    return new String(input.Where(char.IsDigit).ToArray());
}

Ceci s’appuie sur la réponse d’Usman Zafar convertie en groupe de méthodes.

pour obtenir les meilleures performances et réduire la consommation de mémoire, essayez ceci:

using System;
using System.Diagnostics;
using System.Text;
using System.Text.RegularExpressions;

public class Program
{
    private static Regex digitsOnly = new Regex(@"[^\d]");

    public static void Main()
    {
        Console.WriteLine("Init...");

        string phone = "001-12-34-56-78-90";

        var sw = new Stopwatch();
        sw.Start();
        for (int i = 0; i < 1000000; i++)
        {
            DigitsOnly(phone);
        }
        sw.Stop();
        Console.WriteLine("Time: " + sw.ElapsedMilliseconds);

        var sw2 = new Stopwatch();
        sw2.Start();
        for (int i = 0; i < 1000000; i++)
        {
            DigitsOnlyRegex(phone);
        }
        sw2.Stop();
        Console.WriteLine("Time: " + sw2.ElapsedMilliseconds);

        Console.ReadLine();
    }

    public static string DigitsOnly(string phone, string replace = null)
    {
        if (replace == null) replace = "";
        if (phone == null) return null;
        var result = new StringBuilder(phone.Length);
        foreach (char c in phone)
            if (c >= '0' && c <= '9')
                result.Append(c);
            else
            {
                result.Append(replace);
            }
        return result.ToString();
    }

    public static string DigitsOnlyRegex(string phone)
    {
        return digitsOnly.Replace(phone, "");
    }
}

Le résultat sur mon ordinateur est:
Init ...
Temps: 307
Temps: 2178

Je suis sûr qu'il existe un moyen plus efficace de le faire, mais je le ferais probablement:

string getTenDigitNumber(string input)
{    
    StringBuilder sb = new StringBuilder();
    for(int i - 0; i < input.Length; i++)
    {
        int junk;
        if(int.TryParse(input[i], ref junk))
            sb.Append(input[i]);
    }
    return sb.ToString();
}

essayez ceci

public static string cleanPhone(string inVal)
        {
            char[] newPhon = new char[inVal.Length];
            int i = 0;
            foreach (char c in inVal)
                if (c.CompareTo('0') > 0 && c.CompareTo('9') < 0)
                    newPhon[i++] = c;
            return newPhon.ToString();
        }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top