子串难度C#

时间:2011-11-20 16:03:38

标签: c# .net string substring

我有以下方法:

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

感谢大家抽出时间回答我的问题!

6 个答案:

答案 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);
}