-2

I have an assignment using strings and repetitions and this is as far as I've gotten on my own. It keeps outputting the numbers and dashes as 9s and I was wondering how to stop making it do that? Thanks for any advice!

def main():
 phoneNumber = input("Enter phone number as XXX-XXX-XXXX: ")
 newNumber = ''
 for letter in phoneNumber:
   digit = convertLetter(letter)
   newNumber = newNumber + digit
 print("The phone number is: ", newNumber)

def convertLetter(letter):
digit = letter.upper()
if digit == 'A' or digit == 'B' or digit == 'C':
  return '2'
elif digit == 'D' or digit == 'E' or digit == 'F':
  return '3'
elif digit == 'G' or digit == 'H'or digit == 'I':
  return '4'
elif digit == 'J' or digit == 'K' or digit == 'L':
  return '5'
elif digit == 'M' or digit == 'N' or digit == 'O':
  return '6'
elif digit == 'P' or digit == 'Q' or digit == 'R' or digit == 'S':
  return '7'
elif digit == 'T' or digit == 'U' or digit == 'V':
  return '8'
elif digit == 'W' or 'X' or digit == 'Y' or digit == 'Z':
  return '9'
else:
  return letter

main()
Aiyana
  • 1

5 Answers5

0

Take a closer look at the line

elif digit == 'W' or 'X' or digit == 'Y' or digit == 'Z':

Note that you write or 'X' not or digit == 'X'. Since bool('X') == True, this condition always evaluates as True.

Brian61354270
  • 8,690
  • 4
  • 21
  • 43
  • 1
    https://stackoverflow.com/questions/15112125/how-to-test-multiple-variables-against-a-value – AMC Jul 06 '20 at 19:56
  • 1
    @AMC While that question does describe the best practice for this scenario, posting that comment on every answer to this question is a bit excessive. – Brian61354270 Jul 06 '20 at 20:01
  • I do it to ensure that people who answered the question are aware of the duplicate's existence, particularly when it's a relatively common dupe. Are answerers notified if the question is closed? – AMC Jul 06 '20 at 20:07
0

If you want to remove dashes here is a line which save only numbers

newNumber = ''.join([i for i in newNumber if i.isdigit()])

you can add it before print("The phone number is: ", newNumber)

xszym
  • 928
  • 1
  • 5
  • 11
  • https://stackoverflow.com/questions/15112125/how-to-test-multiple-variables-against-a-value – AMC Jul 06 '20 at 19:56
0

In addition to my comment, you could re-arrange your function to:

def convertLetter(letter):
    digit = letter.upper()
    digit_map = {"2": ['A', 'B', 'C'],
                 "3": ['D', 'E', 'F'],
                 "4": ['G', 'H', 'I'],
                 "5": ['J', 'K', 'L'],
                 "6": ['M', 'N', 'O'],
                 "7": ['P', 'Q', 'R', 'S'],
                 "8": ['T', 'U', 'V'],
                 "9": ['W', 'X', 'Y', 'Z']}
    for key, values in digit_map.items():
        if digit in values:
            return key
    return letter


assert convertLetter("z") == "9"
assert convertLetter("-") == "-"
assert convertLetter("e") == "3"
Jan
  • 42,290
  • 8
  • 54
  • 79
  • https://stackoverflow.com/questions/15112125/how-to-test-multiple-variables-against-a-value – AMC Jul 06 '20 at 19:56
0

Here is the fixed code (the problem was on the line with the X although I also generally tidied up the indentation):

def main():
    phoneNumber = input("Enter phone number as XXX-XXX-XXXX: ")
    newNumber = ''
    for letter in phoneNumber:
        digit = convertLetter(letter)
        newNumber = newNumber + digit
    print("The phone number is: ", newNumber)

def convertLetter(letter):
    digit = letter.upper()
    if digit == 'A' or digit == 'B' or digit == 'C':
        return '2'
    elif digit == 'D' or digit == 'E' or digit == 'F':
        return '3'
    elif digit == 'G' or digit == 'H'or digit == 'I':
        return '4'
    elif digit == 'J' or digit == 'K' or digit == 'L':
        return '5'
    elif digit == 'M' or digit == 'N' or digit == 'O':
        return '6'
    elif digit == 'P' or digit == 'Q' or digit == 'R' or digit == 'S':
        return '7'
    elif digit == 'T' or digit == 'U' or digit == 'V':
        return '8'
    elif digit == 'W' or digit == 'X' or digit == 'Y' or digit == 'Z':
        return '9'
    else:
        return letter

main()

We can test it:

Enter phone number as XXX-XXX-XXXX: SOD-YOU-BOJO
The phone number is:  763-968-2656
  • Welcome to StackOverflow! It would be helpful if you code elaborate on precisely what changes you made to fix the code. It may not be immediately obvious what issues you are addressing to future readers of this question. – Brian61354270 Jul 06 '20 at 20:03
0

The str methods maketrans() and translate() were built for this sort of problem:

LETTERS_TO_DIGITS = str.maketrans("abcdefghijklmnoprstuvwxy", "222333444555666777888999")

def convertLetters(string):
    return string.lower().translate(LETTERS_TO_DIGITS)

if __name__ == "__main__":

    phoneNumber = input("Enter phone number as XXX-XXX-XXXX: ")

    newNumber = convertLetters(phoneNumber)

    print("The phone number is:", newNumber)

OUTPUT

> python3 test.py
Enter phone number as XXX-XXX-XXXX: 1-800-FLOWERS
The phone number is: 1-800-3569377
>
cdlane
  • 40,441
  • 5
  • 32
  • 81