C# 转换字母数字电话号码



我已经在这个问题上工作了一段时间,但我一直被困住了,所以我希望有人能把我推向正确的方向。 我有一个 c# 控制台应用程序,它将接收一个字符串并验证它是否仅包含 0-9、a-z、A-Z 和 -。

我遇到的问题是我需要将电话号码中的任何字母转换为各自的号码。因此,如果我输入 1800-Flowers,它将输出为 1800-3569377。 我定义了我的方法:

我不是在寻求解决方案(这是家庭作业),但我正在寻找朝着正确方向前进的动力。 我是否需要将字符串转换为字符数组以分解每个单独的字符,然后在转换方法中使用它将任何字母转换为数字?

这里当然有很多解决方案。 由于您已经在使用正则表达式,因此您可以通过基本方式处理它:

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 将字符串拆分为字符数组,并循环遍历

字母

由于这是针对学校的,我相信您不会为更高级的主题而疯狂。让我们用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;

      }
   }
}

String已经实现了IEnumerable<char> - 所以没有必要在那里"分手"。

将某物

映射到某物(如字母代码到匹配数字)通常使用 map(关联数组)类型(在 C#/.Net 中是字典)完成,这些类型提供将一个值("键")映射到相应的"值" - 考虑使用它。

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("nnPlease 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;
}

我相信有人可以想到更好的方法,但你可以遍历每个数字并将其传递给这个函数:

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

然后只需根据返回的 ASCII 字符分配一个数字。

最新更新