Frage

Schnell auf Anforderung in unserem Projekt hinzufügen. Ein Feld in unserer DB eine Telefonnummer zu halten ist auf nur 10 Zeichen zu ermöglichen. Also, wenn ich bekomme bestanden „(913) -444-5555“ oder irgendetwas anderes, gibt es eine schnelle Möglichkeit, eine Zeichenfolge durch eine Art von Sonder ersetzen Funktion auszuführen, dass ich ihm eine Reihe von Zeichen passieren kann zulassen?

Regex?

War es hilfreich?

Lösung

Auf jeden Fall regex:

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

oder innerhalb einer Klasse neu zu erstellen, die Regex der ganzen Zeit zu vermeiden

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

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

Abhängig von Ihren realen Welt-Eingängen, können Sie einige zusätzliche Logik dort wollen die Dinge zu tun, wie Streifen aus führendem 1'en (für Ferngespräche) oder irgendetwas ein x oder X (für Erweiterungen) nachlauf.

Andere Tipps

Sie können es leicht mit regex:

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

Sie brauchen nicht Regex zu verwenden.

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

Hier ist die Erweiterung Methode Art und Weise, es zu tun.

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

die Regex Methoden in .NET verwenden, sollten Sie in der Lage sein, jede nicht-numerische Ziffer mit \ D übereinstimmen, etwa so:

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

Wie wäre eine Erweiterung Methode, die nicht regex nicht verwendet.

Wenn Sie nicht halten Sie sich an eine der Regex-Optionen zumindest Verwendung RegexOptions.Compiled in den statischen Variablen.

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

Diese baut auf Usman Zafar Antwort auf eine Methodengruppe umgewandelt wird.

für die beste Leistung und geringerer Speicherverbrauch, versuchen Sie dies:

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, "");
    }
}

Das Ergebnis ist in meinem Computer ist:
Init ...
Zeit: 307
Zeit: 2178

Ich bin sicher, dass es eine effizientere Art und Weise, es zu tun, aber ich würde dies wahrscheinlich tun:

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();
}

try this

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();
        }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top