Pergunta

Na minha aplicação C #, eu usar uma expressão regular para validar o formato básico de um número de telefone dos EUA para se certificar de que o usuário não é apenas a inserção de dados falsos. Então, eu retirar tudo, exceto números, de modo que este:

(123) 456-7890 x1234

se torna

12345678901234

no banco de dados. Em várias partes do meu aplicativo, no entanto, eu gostaria de converter este telefone normalizado número de volta para

(123) 456-7890 x1234

Qual é a melhor maneira de fazer tal coisa um? (Não se preocupe com contabilização de formatos de números de telefone internacionais, por sinal.)

Foi útil?

Solução

String.Format("{0:(###) ###-#### x ###}", double.Parse("1234567890123"))

irá resultar em (123) 456-7890 x 123

Outras dicas

Usando um regex você pode substituir:

(\d{3})(\d{3})(\d{4})(\d{4})

com:

(\1) \2-\3 x\4

(Embora eu não estou familiarizado com os números de telefone dos EUA talvez por isso não há mais a ele.)

Gostaria apenas de usar um formato personalizado para transformar o número de volta para a cadeia:

class Program
{
    static void Main(string[] args)
    {
        long phoneNumber = 12345678901234;
        string phoneNumberString = String.Format("{0:(000) 000-0000 x0000}", phoneNumber);
        Console.WriteLine(phoneNumberString);
    }
}

Claro, você iria incluí-lo em uma função que levaria o número de telefone como uma longa e, em seguida, retornar a string (com o formato carregado ou armazenado como uma constante no método, ou algo apropriado para sua situação).

Oh, e se você tê-lo em uma string e não um longo, você pode facilmente converter a string para um longo, e depois passá-lo para a função de formatação. Claro, existem considerações de desempenho aqui se você está fazendo isso várias vezes (uma vez que você está repetindo a corda para criar a longo, e depois convertê-lo de volta para uma cadeia, quando você pode simplesmente usar substring).

Se você só apoiar os números dos Estados Unidos, você pode simplesmente formatar os dígitos para mostrar parênteses e x onde quiser.

Eu preferiria para armazenar a seqüência inteira, gostaria de analisá-lo usando um regex para validá-lo, em seguida, armazená-lo em uma série normalizada.

Para torná-lo aceitar qualquer país, eu faria isso:

Gostaria de acrescentar o código DDI para todos os números de telefone, e depois escondê-lo dos usuários daquele país.

para: (123) 456-7890 x1234 seria armazenado como +1 (123) 456-7890 x1234

O regex (perl compatível) seria algo como (completamente testados e não iria funcionar):

(+ \ d +) \ s + (((\ d {, 3})) (\ s + ([- 0-9.] {6,}) \ s + ((x |? Ext \ w *) \ d {, 4})

  • Este é um número opcional de dígitos precedidos por +
  • Seguido por um ou mais espaços
  • Em seguida, um grupo opcional de até 3 dígitos entre parênteses
  • Em seguida, um ou mais espaços
  • Em seguida, um grupo de 6 ou mais dígitos, traços ou pontos
  • Em seguida, um ou mais espaços
  • Em seguida, um x opcional ou uma palavra que começa com ext (ext, extensão ...) e um grupo de até 4 dígitos

Eu teria um banco de dados de usuários, incluindo país e código de área, em seguida, preencher aqueles em automaticamente em caso que está faltando, o país teria de dígitos padrão convenção de agrupamento para números de telefone (3,4 para os EUA).

  • Então, se você estiver na área 123 nos EUA, e digite 456,7890, seria analisado como +1 (123) 4567890, e você só vê-lo como 456-7890
  • se você estiver em Qatar e digite o número 4444555 extenshn 33, ele é armazenado como +974 4444555 x33, você iria vê-lo como 4444555 x33

O código internacional não será exibido para os usuários de um mesmo país, e o código de área não serão exibidos para usuários no mesmo país e código de área. O número total seria exibido onmouseover (etiqueta HTML?)

Você tem que decompô-lo para o banco de dados? Se não, não. Se você deve, em seguida, você pode armazenar as diferentes partes em diferentes campos, (Areacode, Prefixo, SubscriberNum, extenion).

Ou, extrair o número, e começar a análise. Se é apenas 10 dígitos, então você sabe que não há nenhuma extensão. Todos os dígitos últimos 10, colocá-los na cadeia depois de um 'x' ou algo assim.

Eu fiz algo semelhante a isto em um aplicativo C ++ Eu escrevi os mecanismos de contato diferentes armazenados como uma única cadeia, mas em vez disso, eu fiz o contrário do que você está fazendo. Tomei os campos fora de uma caixa de diálogo, e construiu o número formatado para armazenar como uma string.

Aqui está um método de extensão que podem ajudar:

public static string InsertStringAtPositions(this string str, string insertStr, IEnumerable<int> positions)
{
    if (str != null && insertStr != null && positions != null)
    {
        string newString = string.Empty;
        int previousPos = 0;
        foreach (var pos in positions)
        {
            if (pos < str.Length)
            {
                newString += str.Substring(previousPos, pos - previousPos) + insertStr;
                previousPos = pos;
            }
        }
        if (positions.Last() < str.Length)
        {
            return newString + str.Substring(positions.Last(), str.Length - positions.Last());
        }
        return newString;
    }
    return str;
}

Uso:

// Will convert "0399998888" to "03 9999 8888"
number.InsertStringAtPositions(" ", new[] {2, 6});
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top