Pregunta

Agregado rápido de requisitos en nuestro proyecto. Un campo en nuestra base de datos para contener un número de teléfono está configurado para permitir solo 10 caracteres. Entonces, si me aprueban " (913) -444-5555 " o cualquier otra cosa, ¿hay una manera rápida de ejecutar una cadena a través de algún tipo de función de reemplazo especial que le pueda pasar un conjunto de caracteres para permitir?

Regex?

¿Fue útil?

Solución

Definitivamente expresión regular:

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

o dentro de una clase para evitar volver a crear la expresión regular todo el tiempo:

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

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

Dependiendo de sus entradas en el mundo real, es posible que desee algo de lógica adicional para hacer cosas como eliminar los primeros 1 (para larga distancia) o cualquier cosa detrás de una x o X (para extensiones).

Otros consejos

Puedes hacerlo fácilmente con regex:

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

No necesita usar Regex.

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

Aquí está la forma del método de extensión de hacerlo.

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

Usando los métodos Regex en .NET, debería poder hacer coincidir cualquier dígito no numérico usando \ D, de esta manera:

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

¿Qué tal un método de extensión que no utiliza expresiones regulares?

Si se apega a una de las opciones de Regex, al menos use RegexOptions.Compiled en la variable estática.

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

Esto se basa en la respuesta de Usman Zafar convertida en un grupo de métodos.

para obtener el mejor rendimiento y un menor consumo de memoria, intente esto:

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

El resultado en mi computadora es:
Init ...
Hora: 307
Hora: 2178

Estoy seguro de que hay una manera más eficiente de hacerlo, pero probablemente haría esto:

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

prueba esto

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();
        }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top