/ / Dificultad de subcadena C # - c #, .net, cadena, subcadena

Dificultad de subcadena C # - c #, .net, cadena, subcadena

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 № 1

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