Tengo el siguiente método:
public static string PrepareNumberForInserting(string pNumber)
{
if (pNumber.Length > 7)
{
if (pNumber.Length == 8 && pNumber.Substring(0, 1) == "7")
{
pNumber = pNumber.Substring(1, 8);
}
if (pNumber.Length == 9 && pNumber.Substring(0, 2) == "07")
{
pNumber = pNumber.Substring(2, 9);
}
if (pNumber.Length == 11 && pNumber.Substring(0, 4) == "3897")
{
pNumber = pNumber.Substring(4, 11);
}
if (pNumber.Length == 12 && pNumber.Substring(0, 5) == "38907")
{
pNumber = pNumber.Substring(5, 12);
}
}
else
{
pNumber = string.Format("3897{0}", pNumber);
}
return pNumber;
}
independientemente del formato que el usuario ingrese a sunúmero (ya sea 070300067, 70300067, xxx70300067), quiero extraer los últimos 7 caracteres y los prefijo con 3897. Si ingreso algo que no sea 7xxxxxx, obtengo una Excepción Detalles: System.ArgumentOutOfRangeException: El índice y la longitud deben referirse a una ubicación dentro de la cadena.
¿Alguna idea? ¡Muchas gracias!
Editar:
Resolví mi problema de la siguiente manera:
public static string PrepareNumberForInserting(string pNumber)
{
if (pNumber.Length > 7)
{
if (pNumber.Length == 8 && pNumber.StartsWith("7"))
{
pNumber = pNumber.Substring(1);
}
if (pNumber.Length == 9 && pNumber.StartsWith("07"))
{
pNumber = pNumber.Substring(2);
}
if (pNumber.Length == 11 && pNumber.StartsWith("3897"))
{
pNumber = pNumber.Substring(4);
}
if (pNumber.Length == 12 && pNumber.StartsWith("38907"))
{
pNumber = pNumber.Substring(5);
}
}
pNumber = string.Format("3897{0}", pNumber);
return pNumber;
}
¡Gracias a todos por tomarse el tiempo de responder mi pregunta!
Respuestas
5 para la respuesta № 1Mira el documentación para Substring
:
public string Substring(int startIndex, int length)
El segundo parámetro de subcadena es una longitud, no el índice final. Así código como:
pNumber = pNumber.Substring(5, 12);
Tomará los caracteres del 5 al 16, y no del 5 al 11 como esperaba. Ya que su cadena tiene solo 12 caracteres, esto lleva a la ArgumentOutOfRangeException
usted observó
Para solucionar el problema, puede calcular la longitud (length=endIndex-startIndex+1
), o si necesita todo después de un cierto índice, simplemente puede usar la otra sobrecarga:
pNumber = pNumber.Substring(5);
3 para la respuesta № 2
SubString
Toma una ubicación y longitud, no dos ubicaciones.
1 para la respuesta № 3
if (pNumber.Length == 8 && pNumber.Substring(0, 1) == "7")
{
pNumber = pNumber.Substring(1, 8);
}
Eso dice que si la longitud = 8 toma 8 caracteres después del carácter 1 (es decir, a 9, que es uno más que la longitud)
1 para la respuesta № 4
El método de subcadena toma un índice de inicio y una longitud.
Pero como alternativa intente lo siguiente:
var phoneNumber = "3897" + pNumber.Substring(Math.Max(pNumber.Length - 7, 0));
1 para la respuesta № 5
En las declaraciones en las que omite los primeros x caracteres y toma la subcadena, está tomando demasiados caracteres. En otras palabras
pNumber = pNumber.Substring(2, 9);
debiera ser
pNumber = pNumber.Substring(2, 8);
Por otro lado, si siempre deseas capturar los últimos 7 caracteres, puedes hacer algo como esto:
if (pNumber.Length > 7)
{
pNumber = string.Format("3897{0}", pNumber.Substring(pNumber.Length - 7, 7));
}
else
{
pNumber = string.Format("3897{0}", pNumber);
}
1 para la respuesta № 6
public static string PrepareNumberForInserting(string pNumber)
{
int idx = pNumber.IndexOf("7");
return "3897" + pNumber.SubString(idx >= 0 ? idx + 1 : 0);
}