Подстрока сложности C # - PullRequest
       26

Подстрока сложности C #

1 голос
/ 20 ноября 2011

У меня есть следующий метод:

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, я получу сведения об исключении: System.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 ]

5 голосов
/ 20 ноября 2011

Посмотрите документацию для Substring:

public string Substring(int startIndex, int length)

Второй параметр подстроки - это длина, а не конечный индекс.Таким образом, код вроде:

pNumber = pNumber.Substring(5, 12);

будет принимать символы от 5 до 16, а не от 5 до 11, как вы ожидали.Поскольку ваша строка содержит только 12 символов, это приводит к ArgumentOutOfRangeException, который вы наблюдали.

Чтобы решить проблему, вы можете либо рассчитать длину (length=endIndex-startIndex+1), либо, если вам нужно все после определенного индекса, выможно просто использовать другую перегрузку:

pNumber = pNumber.Substring(5);
3 голосов
/ 20 ноября 2011

SubString занимает местоположение и длину, а не два местоположения.

1 голос
/ 20 ноября 2011
public static string PrepareNumberForInserting(string pNumber)
{
    int idx = pNumber.IndexOf('7');
    return "3897" + pNumber.SubString(idx >= 0 ? idx + 1 : 0);
}
1 голос
/ 20 ноября 2011

В операторах, где вы пропускаете первые 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);
        }
1 голос
/ 20 ноября 2011
               if (pNumber.Length == 8 && pNumber.Substring(0, 1) == "7")
               {
                   pNumber = pNumber.Substring(1, 8);
               }

То есть, если длина = 8, тогда возьмите 8 символов после символа 1 (т.е. до 9, что на единицу больше длины)

1 голос
/ 20 ноября 2011

Метод подстроки принимает начальный индекс и длину.

Но в качестве альтернативы попробуйте следующее:

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