2011-11-20 27 views
1

我有以下方法:子串難度C#

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

感謝大家抽出時間來回答我的問題!

+1

我會給個提示。而不是從字符串的左到右,嘗試另一種方式,並使用子字符串提取最後7個字符並替換它們。如果您仍然遇到困難,我會提供代碼。不過,請先嚐試一下。 – Sid

+0

我會將你的參數重命名爲'phoneNumber'或類似的東西。乍一看,我讀了'pNumber'作爲指向數字的指針。 – CodesInChaos

回答

5

看那documentation for 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

SubString需要的位置和長度,不是兩個地點。

1

子串方法需要一個開始索引和一個長度。

但是作爲備用嘗試以下方法:

var phoneNumber = "3897" + pNumber.Substring(Math.Max(pNumber.Length - 7, 0)); 
1
   if (pNumber.Length == 8 && pNumber.Substring(0, 1) == "7") 
       { 
        pNumber = pNumber.Substring(1, 8); 
       } 

這是說,如果長度= 8再取8個字符的字符1後(即以9比長度多一個)

+0

這將採用字符1到8(含),這比8字符串的最高索引(7)多一個字符。 – CodesInChaos

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); 
     } 
1
public static string PrepareNumberForInserting(string pNumber) 
{ 
    int idx = pNumber.IndexOf('7'); 
    return "3897" + pNumber.SubString(idx >= 0 ? idx + 1 : 0); 
} 
+0

如果數字包含「7」,但不以任何列出的前綴開頭,則顯示與OP代碼不同的行爲。但我不確定OP在這種情況下需要什麼行爲,或者他甚至認爲它從未發生過。 – CodesInChaos