2014-02-20 34 views
7

我一直在處理這個問題一段時間,我一直卡住,所以我希望有人可以推動我在正確的方向。我有一個C#控制檯應用程序,它將接收一個字符串並驗證它僅包含0-9,a-z,A-Z和 - 。C#轉換字母數字電話號碼

我遇到的問題是我需要將電話號碼中的任何字母轉換爲各自的號碼。所以如果我輸入1800-Flowers,它會輸出1800-3569377。我有我的方法定義:

我不是在這裏尋找解決方案(這是家庭作業),但我正在尋找一個正確的方向推。我是否需要將字符串轉換爲char數組來分解每個單獨的字符,然後在convert方法中使用它將任何字母切換爲數字?

+0

但這似乎象的邏輯路徑,因爲每個數字具有分配給它的多個字母。該轉換不會存在預定義的方法。 –

回答

8

這裏肯定有很多解決方案。既然你已經在使用正則表達式,你可以在一個基本的方式來解決:

num = Regex.Replace(num, @"[abcABC]", "2"); 
num = Regex.Replace(num, @"[defDEF]", "3"); 
//.... 

,或者你可以創建一個Dictionary<string,char>並通過每個字符運行,並把它轉換成映射到的人物。喜歡的東西:

var dict = new Dictionary<string, char>(); 
dict.Add("abcABC",'2'); 
//... 

foreach(char c in num.Where(char.IsLetter)) 
{ 
    var digit = dict.First(d => d.Key.Contains(c)).Value; 
    num = num.Replace(c, digit); 
} 

像你說的,在LINQ這裏分割字符串的字符數組,並通過那些是字母

+0

我個人喜歡你的解決方案;) – Dayan

+1

+1。代替'ToUpper',你可以在正則表達式中執行這兩種情況,或者使用[ingore case](http://msdn.microsoft.com/en-us/library/yd1hzczs%28v=vs.110%29.aspx)匹配標誌。 –

+0

良好的電話@AlexeiLevenkov – Jonesopolis

1

String已經實施IEnumerable<char> - 所以沒有必要在那裏「分手」。通常使用map (associative array)類型(在C#/ .Net中,它是Dictionary)完成將某個值(「key」)映射到相應的「值」的映射(像字母代碼到匹配的數字) - 考慮使用它。

-1

我敢肯定有人能想到更好的辦法,但你可以遍歷每個數字,並將它傳遞給這個函數:

int Asc(char ch) 
{  
//Return the character value of the given character  
    return (int)Encoding.ASCII.GetBytes(ch)[0]; 
} 

然後,只需分配一個以返回其ASCII字符的數字。

3

由於這是學校的循環,我敢肯定,你可以」不要因爲更高級的話題而瘋狂。讓我們用switch/case保持簡單。

您可以先將這些字母映射到其對應的編號,只需使用switch/case即可根據字母找到正確的編號。

例如:

String phoneNumber = "1800ab"; 

for(int x=0; x < phoneNumber.Length; x++) 
{ 
    if(Char.IsLetter(phoneNumber[x])) 
    { 
     switch(phoneNumber[x].ToString().ToLower()) 
     { 
     case "a": 
     case "b": 
     case "c": 
      //This is number 2! 
     break; 


     } 
    } 
} 
0
string letter1 = AskuserforInput("first letter"); 
string number1 = SwitchMethod(letter1); 

string letter2 = AskuserforInput("second letter"); 
string number2 = SwitchMethod(letter2); 

string letter3 = AskuserforInput("third letter"); 
string number3 = SwitchMethod(letter3); 

string letter4 = AskuserforInput("fouth letter"); 
string number4 = SwitchMethod(letter4); 

string letter5 = AskuserforInput("fifth letter"); 
string number5 = SwitchMethod(letter5); 

string letter6 = AskuserforInput("sixth letter"); 
string number6 = SwitchMethod(letter6); 

string letter7 = AskuserforInput("seventh letter"); 
string number7 = SwitchMethod(letter7); 

string letter8 = AskuserforInput("eigth letter"); 
string number8 = SwitchMethod(letter8); 

string letter9 = AskuserforInput("ninth letter"); 
string number9 = SwitchMethod(letter9); 

string letter10 = AskuserforInput("tenth letter"); 
string number10 = SwitchMethod(letter10); 
//declaring strings 





Console.WriteLine("This is the original letter phone digits"); 
Console.WriteLine("({0}{1}{2})) {3}{4}{5} - {6}{7}{8}{9} ", letter1,letter2, letter3, letter4, letter5, letter6, letter7, letter8, letter9, letter10);//continue this 


    Console.WriteLine("The actual numbers"); 
    Console.WriteLine("({0}{1}{2})) {3}{4}{5} - {6}{7}{8}{9} ", number1, number2, number3, number4, number5, number6, number7, number8, number9, number10);//continue this 
    Console.Read(); 

    #region End Program 
    //wait for program to acknowledge results 
    Console.BackgroundColor = ConsoleColor.White; 
    Console.ForegroundColor = ConsoleColor.Red; 
    Console.WriteLine("\n\nPlease hit ENTER to end program. . ."); 
    Console.Read(); 
    #endregion 
    Console.Read(); 
    //also pulled this back up from a previous program 


} 

public static string SwitchMethod(string x) 
{ 
    string y = "*"; 
    switch (x) 
    { 
     case "0": 
      y = "0"; 
      break; 
     case "1": 
      y = "1"; 
      break; 
     case "A": 
     case "a": 
     case "B": 
     case "b": 
     case "C": 
     case "c": 
     case "2": 
      y = "2"; 
      break; 

     case "D": 
     case "d": 
     case "E": 
     case "e": 
     case "F": 
     case "f": 
     case "3": 
      y = "3"; 
      break; 

     case "G": 
     case "g": 
     case "H": 
     case "h": 
     case "I": 
     case "i": 
     case "4": 
      y = "4"; 
      break; 

     case "J": 
     case "j": 
     case "K": 
     case "k": 
     case "L": 
     case "l": 
     case "5": 
      y = "5"; 
      break; 

     case "M": 
     case "m": 
     case "N": 
     case "n": 
     case "O": 
     case "o": 
     case "6": 
      y = "6"; 
      break; 

     case "P": 
     case "p": 
     case "Q": 
     case "q": 
     case "R": 
     case "r": 
     case "S": 
     case "s": 
     case "7": 
      y = "7"; 
      break; 


     case "T": 
     case "t": 
     case "U": 
     case "u": 
     case "V": 
     case "v": 
     case "8": 
      y = "8"; 
      break; 

     case "W": 
     case "w": 
     case "X": 
     case "x": 
     case "Y": 
     case "y": 
     case "Z": 
     case "z": 
     case "9": 
      y ="9"; 
      break; 
     default: 
      Console.WriteLine("knucklehead, not a letter"); 
      Console.WriteLine("an '*' will show up"); 
      break; 
      //used cases, next will use to.lower 
      //Lynch helped 

    } 
    return y; 


} 


public static string AskuserforInput(string x) 
{ 
    Console.WriteLine("\nPlease type {0}", x); 
    String input = Console.ReadLine(); 
    return input; 
}