Pergunta

Quick adicionar no requisito em nosso projeto. Um campo em nosso banco de dados para armazenar um número de telefone está configurado para permitir que apenas 10 caracteres. Então, se eu conseguir passar "(913) -444-5555" ou qualquer outra coisa, há uma maneira rápida de executar uma corda através de algum tipo de especial substituir função que eu posso passar um conjunto de caracteres para permitir?

Regex?

Foi útil?

Solução

Definitivamente regex:

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

ou dentro de uma classe para evitar re-criar a regex o tempo todo:

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

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

Dependendo de suas entradas do mundo real, você pode querer alguma lógica adicional lá para fazer coisas como tira fora levando 1s (de longa distância) ou qualquer coisa arrastando um x ou X (para extensões).

Outras dicas

Você pode fazer isso facilmente com regex:

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

Você não precisa usar Regex.

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

Aqui está o caminho método de extensão de fazê-lo.

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

Usando os métodos de Regex em .NET, você deve ser capaz de igualar qualquer dígito não numérico usando \ D, assim:

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

Que tal um método de extensão que não usa regex.

Se você fizer vara para uma das opções Regex pelo menos RegexOptions.Compiled uso na variável estática.

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

Esta baseia-se na resposta de Usman Zafar convertido a um grupo método.

para o melhor desempenho e menor consumo de memória, tente o seguinte:

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

O resultado no meu computador é:
Init ...
Tempo: 307
Time: 2178

Eu tenho certeza que há uma maneira mais eficiente de fazê-lo, mas eu provavelmente faria isso:

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

Tente este

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top