HOWTO · Csharp

Dar formato a una cadena como número de teléfono en C#

En este artículo, se explica cómo formatear una cadena como un número de teléfono en C#.

En esta página

El formato de un número de teléfono depende de lo que represente la entrada. Si tienes una sola cadena con un número, un formateador personalizado puede quitar los separadores y aplicar un patrón de visualización. Si el código de área y las demás partes ya están separados, String.Format o la interpolación de cadenas pueden organizarlos. Estos dos últimos métodos no analizan una cadena arbitraria de teléfono ni comprueban que sea un número válido.

Elige un método para dar formato a números de teléfono en C#

Usa un método personalizado cuando la entrada sea una sola cadena y quieras normalizar su puntuación antes de mostrarla. El ejemplo siguiente usa el patrón predeterminado (##) ###-####, que agrupa nueve dígitos en grupos de dos, tres y cuatro. Cambia el patrón para adaptarlo a la convención de numeración que necesite tu aplicación; este patrón es una opción de visualización, no un estándar telefónico universal.

Si el número ya está dividido en un código de área y dos partes locales, usa String.Format o la interpolación para colocar esos valores en una cadena. Estos métodos conservan las partes proporcionadas y no determinan cómo dividirlas ni limpiarlas. Ninguno valida los códigos de país, las extensiones ni si se puede llamar al número resultante.

Dar formato a una cadena como número de teléfono en C# con un método personalizado

El método formatPhNumber() acepta la cadena de entrada y un argumento de formato obligatorio. Pasa string.Empty o null para seleccionar el patrón predeterminado (##) ###-####; pasa otra cadena de formato numérico personalizado de .NET para elegir un patrón de visualización distinto. El método elimina los caracteres que no sean dígitos ASCII antes de aplicar el formato. Devuelve una cadena vacía si la entrada no contiene dígitos ASCII.

La implementación completa aparece en la última sección. Sus operaciones principales son Regex.Replace(phoneNum ?? "", @"[^0-9]", string.Empty) y Convert.ToInt64(digits).ToString(phoneFormat). Al pasar un formato, quien llama al método puede cambiar el patrón de visualización sin modificar el paso de limpieza. El método resulta útil para una convención de visualización conocida y de longitud fija, pero no para analizar números internacionales en general.

Dar formato a las partes de un número de teléfono con String.Format

String.Format("({0}) {1}-{2}", areaCode, firstPart, secondPart) coloca tres cadenas existentes en las posiciones indicadas. Por ejemplo, el primer argumento ocupa {0}, el segundo {1} y el tercero {2}. Es adecuado cuando otra parte de la aplicación ya analizó o recopiló esos componentes.

Los marcadores de posición organizan texto; no eliminan puntuación, deducen los límites entre componentes ni validan longitudes. Valida cada parte por separado si tu aplicación requiere una forma específica. String.Format es el nombre de la API usado aquí; está disponible a través de System.String y suele invocarse como string.Format en código C#.

Dar formato a las partes de un número de teléfono con interpolación de cadenas

La interpolación expresa directamente la misma organización: $"({areaCode}) {firstPart}-{secondPart}". Las expresiones entre llaves se insertan en la cadena que las rodea. Es concisa cuando las partes ya tienen nombres de variables y tiene el mismo alcance que String.Format: combina valores, pero no analiza ni valida una cadena completa de número de teléfono.

Elige entre la interpolación y String.Format según cuál se lea con mayor claridad en el código circundante. Ninguno modifica los valores de entrada ni aplica automáticamente reglas de formato telefónico.

Limitaciones del formateador personalizado

El formateador personalizado trata deliberadamente la entrada como dígitos que se mostrarán. No conserva un cero inicial: al convertir los dígitos limpios a long, los analiza como un número, por lo que el cero inicial se descarta antes de aplicar el formato. Si el número tiene más dígitos de los que admite Int64, Convert.ToInt64 lanza OverflowException. El método también supone que el formato solicitado es válido para el formato numérico; un formato inadecuado puede dar un resultado inesperado o provocar un error.

Para números de teléfono en los que importan los ceros iniciales, cuyas longitudes varían o que pueden superar el rango de Int64, evita convertir los dígitos en un entero. Conserva los dígitos como texto e inserta separadores según una longitud y una regla de numeración elegidas explícitamente, o usa una biblioteca telefónica si necesitas analizar y validar números de distintas regiones. Capturar los errores de conversión puede evitar que la aplicación se cierre, pero no convierte un número no reconocido en uno válido.

Ejemplo completo en C# y salida

Ejecuta este ejemplo con una entrada habitual de nueve dígitos. Aplica el patrón de visualización predeterminado después de quitar de la entrada los separadores que no sean dígitos.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

using System;
using System.Text.RegularExpressions;

class PhoneFormatter
{
    public static string formatPhNumber(string phoneNum, string phoneFormat)
    {
        if (phoneFormat == null || phoneFormat.Length == 0)
        {
            phoneFormat = "(##) ###-####";
        }

        string digits = Regex.Replace(phoneNum ?? "", @"[^0-9]", "");
        if (digits.Length == 0)
        {
            return "";
        }

        return Convert.ToInt64(digits).ToString(phoneFormat);
    }

    static void Main()
    {
        string phoneNumber = "123456789";
        Console.WriteLine(formatPhNumber(phoneNumber, null));
    }
}
(12) 345-6789