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ď č. 1Pozri 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);
}