c# regex formatting phone-number

c# - Conversión de un número de teléfono normalizado a una versión fácil de usar



regex formatting (6)

Si solo admite números de EE. UU., Simplemente puede formatear los dígitos para mostrar los paréntesis yx donde quiera.

Preferiría almacenar toda la cadena, la analizaría usando una expresión regular para validarla, y luego la almacenaría en una cadena normalizada.

Para hacerlo aceptar cualquier país, haría esto:

Agregaría el código IDD a todos los números de teléfono y luego lo escondería de los usuarios de ese país.

entonces: (123) 456-7890 x1234 se almacenaría como +1 (123) 456-7890 x1234

La expresión regular (perl-compatible) sería algo así como (completamente no probado y no funcionaría):

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

  • Este es un número opcional de dígitos precedidos por +
  • Seguido por uno o más espacios
  • Entonces un grupo opcional de hasta 3 dígitos entre paréntesis
  • Entonces uno o más espacios
  • Entonces un grupo de 6 o más dígitos, rayas o puntos
  • Entonces uno o más espacios
  • Luego una x o una palabra opcional que comienza con ext (ext, extensión ...) y un grupo de hasta 4 dígitos

Tendría una base de datos de usuarios que incluye el código de país y área, luego los llenaba automáticamente en caso de que faltaran, el país tendría su convención de agrupación de dígitos predeterminada para los números de teléfono (3,4 para los Estados Unidos).

  • Por lo tanto, si se encuentra en el área 123 de los Estados Unidos e ingresa 456.7890, se analizará como +1 (123) 4567890, y solo lo verá como 456-7890.
  • si estás en Qatar e ingresas el número 4444555 de la extensión 33, está almacenado como +974 4444555 x33, lo verías como 4444555 x33

El código internacional no se mostrará a los usuarios en el mismo país, y el código de área no se mostrará a los usuarios en el mismo país y código de área. El número completo se mostraría onmouseover (etiqueta HTML?)

En mi aplicación C #, uso una expresión regular para validar el formato básico de un número de teléfono de los EE. UU. Para asegurarme de que el usuario no solo está ingresando datos falsos. Luego, elimino todo excepto los números, así que esto:

(123) 456-7890 x1234

se convierte

12345678901234

en la base de datos. En varias partes de mi aplicación, sin embargo, me gustaría convertir este número normalizado de nuevo a

(123) 456-7890 x1234

¿Cuál es la mejor manera de hacer tal cosa? (Por cierto, no se preocupe por la contabilidad de los formatos de números de teléfono internacionales).


Solo usaría una cadena de formato personalizada para transformar el número en la cadena:

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

Por supuesto, lo descompondrías en una función que tomaría el número de teléfono como largo y luego regresaría la cadena (con el formato cargado o almacenado como una constante en el método, o algo apropiado para tu situación).

Ah, y si lo tienes en una cadena y no mucho, puedes convertir fácilmente la cuerda a una larga, y luego pasarla a la función de formateo. Por supuesto, hay consideraciones de rendimiento aquí si lo hace de forma repetida (ya que está iterando la cadena para crear el largo, y luego convertirlo de nuevo a una cadena, cuando podría usar una subcadena).


Usando una expresión regular puede reemplazar:

(/d{3})(/d{3})(/d{4})(/d{4})

con:

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

(Aunque no estoy familiarizado con los números de teléfono de los EE. UU., Quizás haya más).


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

Dará como resultado (123) 456-7890 x 123


¿TIENES que descomponerlo para el DB? Si no, no lo hagas Si DEBE, puede almacenar las diferentes partes en diferentes campos (Código de área, Prefijo, NÚMERO DE ABONADO, EXTENSIÓN).

O bien, extraiga el número y comience a analizar. Si solo tiene 10 dígitos, entonces sabes que no hay extensión. Todos los dígitos pasan del 10, pégalos en la cadena después de una ''x'' o algo así.

Hice algo similar a esto en una aplicación de C ++ Escribí los diferentes mecanismos de contacto almacenados como una sola cadena, pero en cambio, hice lo contrario de lo que está haciendo. Saqué los campos de un cuadro de diálogo y construí el número formateado para almacenar como una cadena.


Aquí hay un método de extensión que podría ayudar:

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