Reputation: 531
I'm working on a phone number converter code with C# ,struggling with replacing any alphabetic character to its corresponding number on the phone keys.In the code down here ,the variable result already has a 10 characters ,wich is a mix of numbers and letters.As you see in the code ,I'm trying to use the Replace method through out the switch case,but it gives me wrong results .Any ideas ?Thanks. Sorry I forgot to mention that Arrays are not allowed to be used in this project,only conditions and repeatition.Ah ,and it's console C#.
for (int i = 0; i < result.Length; i++)
{
switch (buffer)
{
case "A":
case "B":
case "C": myNumber = result.Replace(buffer, "2");
break;
case "D":
case "E":
case "F": myNumber = result.Replace(buffer, "3");
break;
case "G":
case "H":
case "I": myNumber = result.Replace(buffer, "4");
break;
case "J":
case "K":
case "L": myNumber = result.Replace(buffer, "5");
break;
case "M":
case "N":
case "O": myNumber = result.Replace(buffer, "6");
break;
case "P":
case "Q":
case "R":
case "S": myNumber = result.Replace(buffer, "7");
break;
case "T":
case "U":
case "V": myNumber = result.Replace(buffer, "8");
break;
case "W":
case "X":
case "Y":
case "Z": myNumber = result.Replace(buffer, "9");
break;
}
Console.WriteLine("({0})-{1}-{2}", myNumber.Substring(0, 3), myNumber.Substring(3, 3), myNumber.Substring(6, 4));
Upvotes: 0
Views: 414
Reputation: 1528
Do remember to use StringBuilder when building strings, especialy when building strings in iterations.
private static readonly Dictionary<Char, Byte> mappings = new Dictionary<Char, Byte>() {
{ 'A', 2 }, { 'B', 2 }, { 'C', 2 },
{ 'D', 3 }, { 'E', 3 }, { 'F', 3 },
{ 'G', 4 }, { 'H', 4 }, { 'I', 4 },
{ 'J', 5 }, { 'K', 5 }, { 'L', 5 },
{ 'M', 6 }, { 'N', 6 }, { 'O', 6 },
{ 'P', 7 }, { 'Q', 7 }, { 'R', 7 }, { 'S', 7 },
{ 'T', 8 }, { 'U', 8 }, { 'V', 8 },
{ 'W', 9 }, { 'X', 9 }, { 'Y', 9 }, { 'Z', 9},
{ ' ', 0 }
};
private static string StringToKeystrokes(string s)
{
StringBuilder sb = new StringBuilder();
foreach (char c in s)
{
if (mappings.ContainsKey(c))
{
sb.Append(mappings[c]);
}
}
return sb.ToString();
}
Using the code.
string s = "ABC DEF GHI JKL MNO PQRS TUV WXYZ";
Console.WriteLine(s);
Console.WriteLine(StringToKeystrokes(s));
Upvotes: 0
Reputation: 2427
Consider the following rewrite...
string result = "1800CALLME";
string myNumber = string.Empty;
for (int i = 0; i < result.Length; i++)
{
string buffer = result[i].ToString();
switch (buffer)
{
case "A":
case "B":
case "C": myNumber += "2";
break;
case "D":
case "E":
case "F": myNumber += "3";
break;
case "G":
case "H":
case "I": myNumber += "4";
break;
case "J":
case "K":
case "L": myNumber += "5";
break;
case "M":
case "N":
case "O": myNumber += "6";
break;
case "P":
case "Q":
case "R":
case "S": myNumber += "7";
break;
case "T":
case "U":
case "V": myNumber += "8";
break;
case "W":
case "X":
case "Y":
case "Z": myNumber += "9";
break;
}
Console.WriteLine("({0})-{1}-{2}", myNumber.Substring(0, 3), myNumber.Substring(3, 3), myNumber.Substring(6, 4));
Good Luck!
Upvotes: 0
Reputation: 125660
You're assigning Replace
method result to myNumber
, but in next loop iteration you're taking result
as Replace
parameter again. It can't work.
How about that:
private static readonly Dictionary<string, string> PhoneReplacements =
new Dictionary<string, string>() {
{ "A", "1" }, { "B", "1" }, { "C", "1" },
{ "D", "2" }, { "E", "2" }, { "F", "2" },
{ "G", "3" }, { "H", "3" }, { "I", "3" }
// (...)
};
private static string GetPhoneNumber(string number)
{
foreach(var r in PhoneReplacements)
{
number = number.Replace(r.Key, r.Value);
}
return number;
}
Upvotes: 2
Reputation: 24895
String
are immutable. When you do
result.Replace(buffer, "9");
result does not change.
So, you are only using the replacement of the last iteration, not the combination of all the replacements that your code has done. That is what you are assigning to your code.
Instead of
myNumber = result.Replace(buffer, "9");
do
result = result.Replace(buffer, "9");
or even, if you wish
myNumber = result = result.Replace(buffer, "9");
Upvotes: 1