Convertendo um número de telefone normalizado para uma versão user-friendly
-
06-07-2019 - |
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.)
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});