/ / Problémy s podtržkami C # - c #, .net, string, podreťazec

Podreťazec zodpovedá pridaným obtiažnosť C# - c#, .net, reťazec podreťazec

Mám nasledujúcu metódu:

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

bez ohľadu na to, aký formát užívateľ zadáčíslo (či už je to 070300067, 70300067, xxx70300067), chcem extrahovať posledných 7 znakov a predponu s 3897. Ak zadám čokoľvek iné ako 7xxxxxx dostanem podrobnosti o výnimke: System.ArgumentOutOfRangeException: Index a dĺžka musia odkazovať na miesto v rámci reťazca.

Nejaký nápad? Ďakujem mnohokrát!

edit:

Problém som vyriešil nasledujúcim spôsobom:

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

Ďakujem vám všetkým za odpoveď na moju otázku!

odpovede:

5 pre odpoveď č. 1

Pozri na dokumentácia pre Substring:

public string Substring(int startIndex, int length)

Druhým parametrom pre podreťazec je dĺžka, nie koncový index. Takto kód:

pNumber = pNumber.Substring(5, 12);

Bude mať znaky 5 až 16, a nie 5 až 11, ako ste očakávali. Pretože váš reťazec má len 12 znakov, vedie to k ArgumentOutOfRangeException ste si všimli.

Ak chcete problém odstrániť, môžete buď vypočítať dĺžku (length=endIndex-startIndex+1), alebo ak potrebujete po určitom indexe všetko, môžete jednoducho použiť iné preťaženie:

pNumber = pNumber.Substring(5);

3 pre odpoveď č. 2

SubString má polohu a dĺžku, nie dve miesta.


1 pre odpoveď č. 3
               if (pNumber.Length == 8 && pNumber.Substring(0, 1) == "7")
{
pNumber = pNumber.Substring(1, 8);
}

To znamená, že ak dĺžka = 8 potom zaberá 8 znakov za znakom 1 (t. J. Do 9, čo je o jednu viac ako dĺžka)


1 pre odpoveď č. 4

Metóda podreťazca má štartovací index a dĺžku.

Ale ako alternatívny skúste nasledujúce:

var phoneNumber = "3897" + pNumber.Substring(Math.Max(pNumber.Length - 7, 0));

1 pre odpoveď č. 5

Vo vyhláseniach, kde "preskočíte prvé znaky x a vezmete podreťazec", ste znovu chytili príliš veľa znakov. Inými slovami

pNumber = pNumber.Substring(2, 9);

by mala byť

pNumber = pNumber.Substring(2, 8);

Na druhej strane, ak chcete vždy chytiť posledných 7 znakov, potom by ste to mohli urobiť takto:

      if (pNumber.Length > 7)
{
pNumber = string.Format("3897{0}", pNumber.Substring(pNumber.Length - 7, 7));
}
else
{
pNumber = string.Format("3897{0}", pNumber);
}

1 pre odpoveď č. 6
public static string PrepareNumberForInserting(string pNumber)
{
int idx = pNumber.IndexOf("7");
return "3897" + pNumber.SubString(idx >= 0 ? idx + 1 : 0);
}