-1

So the program should take a number and then should print this number using text.

print("Enter your number")
Number = int(input())


def number_to_text_ones(ones):
    if ones == 1:
        print("one")
    elif ones == 2:
        print("two")
    elif ones == 3:
        print("three")
    elif ones == 4:
        print("four")
    elif ones == 5:
        print("five")
    elif ones == 6:
        print("six")
    elif ones == 7:
        print("seven")
    elif ones == 8:
        print("eight")
    elif ones == 9:
        print("nine")


def number_to_text_tens(tens):
    if tens == 2:
        print("twenty ")
    elif tens == 3:
        print("thirty ")
    elif tens == 4:
        print("fourry ")
    elif tens == 5:
        print("fifty ")
    elif tens == 6:
        print("sixty ")
    elif tens == 7:
        print("seventy ")
    elif tens == 8:
        print("eighty ")
    elif tens == 9:
        print("ninety ")


def number_to_text_hundreds(hundreds):

    if hundreds == 1:
        print("one hundred")
    elif hundreds == 2:
        print("two hundreds")
    elif hundreds == 3:
        print("three hundreds")
    elif hundreds == 4:
        print("four hundreds")
    elif hundreds == 5:
        print("five hundreds")
    elif hundreds == 6:
        print("six hundreds")
    elif hundreds == 7:
        print("seven hundreds")
    elif hundreds == 8:
        print("eight hundreds")
    elif hundreds == 9:
        print("nine hundreds")


if Number == 0:
    print("zero")
elif Number == 10:
    print("ten")
elif Number == 11:
    print("eleven")
elif Number == 12:
    print("twelve")
elif Number == 13:
    print("thirteen")
elif Number == 14:
    print("fourteen")
elif Number == 15:
    print("fifteen")
elif Number == 16:
    print("sixteen")
elif Number == 17:
    print("seventeen")
elif Number == 18:
    print("eighteen")
elif Number == 19:
    print("nineteen")


if Number < 10:
    Result = Number % 10
    number_to_text_ones(Result)
elif (Number >= 20 and Number < 100):
    First = Number // 10
    Second = (Number - (First * 10)) % 10
    Result = First * 10 + Second
    number_to_text_tens(First)
    number_to_text_ones(Second)
elif (Number >= 100 and Number < 1000):
    First = Number // 100
    Second = (Number - (First * 100)) // 10
    Third = (Number - (First * 100) - (Second * 10)) % 10
    Result = First * 100 + Second * 10 + Third
    number_to_text_hundreds(First)
    number_to_text_tens(Second)
    number_to_text_ones(Third)

The problem is when I input, say, 895 my output will be:

eight hundreds

ninety 

five

Few questions I have:

  1. How to make my output look better?

  2. Is there any way to get rid of those if statements and use something more efficient? Something like switch/case

J...S
  • 5,079
  • 1
  • 20
  • 35
Alexander
  • 17
  • 1
  • you should use dictionaries as a replacement for switch cases in python as explained here https://stackoverflow.com/a/103081/8370670 . And if you are using python3 you should use print with end parameter to print text without a newline at the end. – vishal May 03 '18 at 12:43

4 Answers4

1

Here are the answers:

  1. print function has an optional parameter end which specifies what will be written at the end of the string you are printing. Default is new line ('\n'). You would like to use

    print('something', end=' ')
    

    Nicer than that would be to first build a string with the name of entire number and the use print only once at the end.

  2. A nice way to solve this is with dictionary, e.g.:

    name = {1: "one hundred",
            2: "two hundreds",
            3: "three hundreds"}[hundreds]
    
AleksMat
  • 854
  • 6
  • 11
0

I suspect there is a library for this but I'd refactor to use the following pattern

ones_text = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']

def number_to_text_ones(number):
    return ones_text[number - 1]
Tom Ridd
  • 1
  • 2
  • as sensible as this refactor is, it has literally *nothing* to do with the question asked and won't solve the problem posed by OP. – Zinki May 03 '18 at 12:48
  • @Zinki I used both ^ this and mabac's answers and it works fine now – Alexander May 03 '18 at 12:56
0

You should use dictionaries as it will reduce the lines of code (if-else conditions will no more be there just a return statement would be sufficient ) and will give your code a better look also execution time will decrease because using if-else condition the program checks each every condition specified, So dictionaries will make help u alot

And for printing your output in one line this one is a better

print(number_to_text_hundreds(First) + number_to_text_tens(Second) + number_to_text_ones(Third))

number_to_text_hundereds , number_to_text_tens and number_to_text_ones returns a value corresponding to value passed to function

Keshav Garg
  • 359
  • 1
  • 9
0

I suggest you using lists of strings as follows:

print("Enter your number")
Number = int(input())


units    = ['', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
teens    = ["ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"]
tens     = ['', '', "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]

h = Number // 100
t = (Number % 100) // 10
u = (Number % 10)

result = []

if h == 0:
    pass
elif h == 1:
    result.append('one hundred')
else:
    result.append(units[h] + ' hundreds')

if (t == 0):
    if (u != 0):
        result.append(units[u])
    elif (h == 0):
        result = ['zero']
elif (t == 1):
    result.append(teens[u])
else:
    result.append(tens[t])
    if (u != 0):
        result.append(units[u])

result = ' '.join(result)

print(result)
# input = 895 : result = 'eight hundreds ninety five'
# input = 507 : result = 'five hundreds seven'
# input = 120 : result = 'one hundred twenty'
# input = 071 : result = 'seventy one'
# input =  16 : result = 'sixteen'
# input =   0 : result = 'zero'
Laurent H.
  • 6,316
  • 1
  • 18
  • 40