我有以下方法:
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;
}
无论用户输入的数字是什么格式(070300067,70300067,xxx70300067),我想提取最后7个字符并用3897作为前缀。如果我输入7xxxxxx以外的任何内容,我会得到一个异常详情:系统.ArgumentOutOfRangeException:索引和长度必须引用字符串中的位置。
有什么想法吗?非常感谢你!
编辑:
我通过以下方式解决了我的问题:
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;
}
感谢大家抽出时间回答我的问题!
答案 0 :(得分:5)
查看documentation for Substring
:
public string Substring(int startIndex, int length)
substring的第二个参数是长度,而不是结束索引。因此代码如下:
pNumber = pNumber.Substring(5, 12);
将按预期采用字符5到16,而不是5到11。由于您的字符串只有12个字符,因此会导致您观察到ArgumentOutOfRangeException
。
要解决此问题,您可以计算长度(length=endIndex-startIndex+1
),或者如果您需要在某个索引之后的所有内容,则只需使用其他重载:
pNumber = pNumber.Substring(5);
答案 1 :(得分:3)
SubString
占据的位置和长度,而不是两个位置。
答案 2 :(得分:1)
substring方法采用起始索引和长度。
但作为替代方案,请尝试以下方法:
var phoneNumber = "3897" + pNumber.Substring(Math.Max(pNumber.Length - 7, 0));
答案 3 :(得分:1)
if (pNumber.Length == 8 && pNumber.Substring(0, 1) == "7")
{
pNumber = pNumber.Substring(1, 8);
}
这就是说,如果长度= 8,则在字符1之后取8个字符(即到9,这比长度长一个)
答案 4 :(得分:1)
在你跳过前x个字符并获取子字符串的语句中,你抓住了太多的字符。换句话说
pNumber = pNumber.Substring(2, 9);
应该是
pNumber = pNumber.Substring(2, 8);
另一方面,如果你总是想要抓住最后7个字符,那么你可以这样做:
if (pNumber.Length > 7)
{
pNumber = string.Format("3897{0}", pNumber.Substring(pNumber.Length - 7, 7));
}
else
{
pNumber = string.Format("3897{0}", pNumber);
}
答案 5 :(得分:1)
public static string PrepareNumberForInserting(string pNumber)
{
int idx = pNumber.IndexOf('7');
return "3897" + pNumber.SubString(idx >= 0 ? idx + 1 : 0);
}