Pregunta

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

  

(123) 456-7890 x1234

se convierte

  

12345678901234

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

  

(123) 456-7890 x1234

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

¿Fue útil?

Solución

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

Resultará en (123) 456-7890 x 123

Otros consejos

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 EE. UU., quizás haya más)

Simplemente usaría una cadena de formato personalizado para transformar el número nuevamente 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 factorizaría en una función que tomaría el número de teléfono como largo y luego devolvería la cadena (con el formato cargado o almacenado como una constante en el método, o algo apropiado para su situación).

Ah, y si lo tiene en una cadena y no en una larga, puede convertir fácilmente la cadena en una larga y luego pasarla a la función de formato. Por supuesto, hay consideraciones de rendimiento aquí si lo está haciendo repetidamente (ya que está iterando la cadena para crear el largo y luego convirtiéndola nuevamente en una cadena, cuando podría usar la subcadena).

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

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

Para que acepte cualquier país, haría esto:

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

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

La expresión regular (compatible con perl) sería algo así como (completamente no probada 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 precedido por +
  • Seguido por uno o más espacios
  • Luego, un grupo opcional de hasta 3 dígitos entre paréntesis
  • Entonces uno o más espacios
  • Luego un grupo de 6 o más dígitos, guiones o puntos
  • Entonces uno o más espacios
  • Luego, una x opcional o una palabra 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 de área, luego los completaría automáticamente en caso de que falten, 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).

  • Entonces, si está en el área 123 de los EE. UU. 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 extenshn 33, se almacena como +974 4444555 x33, lo verías como 4444555 x33

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

¿TIENES que desglosarlo para el DB? Si no, no lo hagas. Si DEBE, puede almacenar las diferentes partes en diferentes campos (Código de área, Prefijo, Núm. De abonado, Extensión).

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

Hice algo similar a esto en una aplicación C ++. Escribí los diferentes mecanismos de contacto almacenados como una sola cadena, pero en cambio, hice lo contrario de lo que está haciendo. Quité los campos de un cuadro de diálogo y construí el número formateado para almacenarlo 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});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top