#Modified code import doctest;
Modified code
import doctest;
def englishify(number):
"""Format NUMBER into standard English form.
NUMBER must be in range [0..999999]
>>> englishify(0)
'Zero'
>>> englishify(10)
'Ten'
>>> englishify(20)
'Twenty'
>>> englishify(99)
'Ninety Nine'
>>> englishify(100)
'One Hundred'
>>> englishify(101)
'One Hundred and One'
>>> englishify(1001)
'One Thousand and One'
>>> englishify(1201)
'One Thousand, Two Hundred and One'
>>> englishify(123201)
'One Hundred and Twenty Three Thousand, Two Hundred and One'
"""
Units = [None, 'One', 'Two', 'Three', 'Four', 'Five',
'Six', 'Seven', 'Eight', 'Nine',
'Ten', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen',
'Sixteen', 'Seventeen', 'Eighteen', 'Nineteen']
Tens = [None, None, 'Twenty', 'Thirty', 'Forty', 'Fifty',
'Sixty', 'Seventy', 'Eighty', 'Ninety']
if number < 20:
return Units[number] or 'Zero'
if number < 100:
return ' '.join(filter(None, [Tens[number//10], Units[number%10]]))
# Larger numbers - break down and englishify each part
parts = list(filter(None,
map(lambda quantity, number:
englishify(number) + quantity if number else None,
[' Thousand', ' Hundred', ''],
[number // 1000, number // 100 % 10, number % 100])))
if len(parts) == 1:
return parts[0]
return ' and '.join([', '.join(parts[:-1]), parts[-1]])
if __name__ == '__main__':
doctest.testmod()
#Modified code import doctest;
def englishify(number):
"""Format NUMBER into standard English form.
NUMBER must be in range [0..999999]
>>> englishify(0)
'Zero'
>>> englishify(10)
'Ten'
>>> englishify(20)
'Twenty'
>>> englishify(99)
'Ninety Nine'
>>> englishify(100)
'One Hundred'
>>> englishify(101)
'One Hundred and One'
>>> englishify(1001)
'One Thousand and One'
>>> englishify(1201)
'One Thousand, Two Hundred and One'
>>> englishify(123201)
'One Hundred and Twenty Three Thousand, Two Hundred and One'
"""
Units = [None, 'One', 'Two', 'Three', 'Four', 'Five',
'Six', 'Seven', 'Eight', 'Nine',
'Ten', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen',
'Sixteen', 'Seventeen', 'Eighteen', 'Nineteen']
Tens = [None, None, 'Twenty', 'Thirty', 'Forty', 'Fifty',
'Sixty', 'Seventy', 'Eighty', 'Ninety']
if number < 20:
return Units[number] or 'Zero'
if number < 100:
return ' '.join(filter(None, [Tens[number//10], Units[number%10]]))
# Larger numbers - break down and englishify each part
parts = list(filter(None,
map(lambda quantity, number:
englishify(number) + quantity if number else None,
[' Thousand', ' Hundred', ''],
[number // 1000, number // 100 % 10, number % 100])))
if len(parts) == 1:
return parts[0]
return ' and '.join([', '.join(parts[:-1]), parts[-1]])
if __name__ == '__main__':
doctest.testmod()
Modified code
import doctest;
def englishify(number):
"""Format NUMBER into standard English form.
NUMBER must be in range [0..999999]
>>> englishify(0)
'Zero'
>>> englishify(10)
'Ten'
>>> englishify(20)
'Twenty'
>>> englishify(99)
'Ninety Nine'
>>> englishify(100)
'One Hundred'
>>> englishify(101)
'One Hundred and One'
>>> englishify(1001)
'One Thousand and One'
>>> englishify(1201)
'One Thousand, Two Hundred and One'
>>> englishify(123201)
'One Hundred and Twenty Three Thousand, Two Hundred and One'
"""
Units = [None, 'One', 'Two', 'Three', 'Four', 'Five',
'Six', 'Seven', 'Eight', 'Nine',
'Ten', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen',
'Sixteen', 'Seventeen', 'Eighteen', 'Nineteen']
Tens = [None, None, 'Twenty', 'Thirty', 'Forty', 'Fifty',
'Sixty', 'Seventy', 'Eighty', 'Ninety']
if number < 20:
return Units[number] or 'Zero'
if number < 100:
return ' '.join(filter(None, [Tens[number//10], Units[number%10]]))
# Larger numbers - break down and englishify each part
parts = list(filter(None,
map(lambda quantity, number:
englishify(number) + quantity if number else None,
[' Thousand', ' Hundred', ''],
[number // 1000, number // 100 % 10, number % 100])))
if len(parts) == 1:
return parts[0]
return ' and '.join([', '.join(parts[:-1]), parts[-1]])
if __name__ == '__main__':
doctest.testmod()
You'll find that when you reach the bigger numbers, there's a useful recursive property. We can split off the thousands and the hundreds, format each non-zero part separately, and then join using one of the techniques from Joining words together with a comma, and "and". For example, consider these inputs:
The extension to support millions and more should now be obvious - just add the unit and its extraction to the list passed to map()
.
You'll find that when you reach the bigger numbers, there's a useful recursive property. We can split off the thousands and the hundreds, format each non-zero part separately, and then join. For example, consider these inputs:
You'll find that when you reach the bigger numbers, there's a useful recursive property. We can split off the thousands and the hundreds, format each non-zero part separately, and then join using one of the techniques from Joining words together with a comma, and "and". For example, consider these inputs:
The extension to support millions and more should now be obvious - just add the unit and its extraction to the list passed to map()
.
def englishify(number):
"""Format NUMBER into standard English form.
NUMBER must be in range [0..999999]
>>> englishify(0)
'Zero'
>>> englishify(10)
'Ten'
>>> englishify(20)
'Twenty'
>>> englishify(99)
'Ninety Nine'
>>> englishify(100)
'One Hundred'
>>> englishify(101)
'One Hundred and One'
>>> englishify(1001)
'One Thousand and One'
>>> englishify(1201)
'One Thousand, Two Hundred and One'
>>> englishify(123201)
'One Hundred and Twenty Three Thousand, Two Hundred and One'
"""
if number==0:
Units = [None, 'One', 'Two', 'Three', return'Four', 'Zero'
'Five',
#Numbers 0-19 (unique numbers)
OneToNine= 'One Two Three'Six', Four'Seven', Five'Eight', Six'Nine',
Seven Eight Nine'.split()
TenToNineteen = 'Ten Eleven Twelve Thirteen Fourteen'Ten', Fifteen'Eleven', Sixteen'Twelve', Seventeen'Thirteen', Eighteen'Fourteen', Nineteen'.split()'Fifteen',
ZeroToNineteen = [''] + OneToNine + TenToNineteen
'Sixteen', #Numbers'Seventeen', >='Eighteen', 20'Nineteen']
at intervals of 10
Tens = [None, None, Tens'Twenty', ='Thirty', 'Twenty'Forty', Thirty'Fifty',
Forty Fifty Sixty Seventy Eighty Ninety'.split()
#1. Number from'Sixty', 1-19'Seventy', 'Eighty', 'Ninety']
if number < 20:
return ZeroToNineteen[number]
#2. NumberUnits[number] fromor 20-99'Zero'
if number < 100:
result = Tens[int(number/10)-2] +return ' ' + ZeroToNineteen[int.join(number%10)]
filter(None, return[Tens[number//10], result.rstrip(Units[number%10]]))
#3.# Larger numbers - break down and englishify each part
parts = list(filter(None,
map(lambda quantity, number: englishify(number) + quantity if number else None,
[' Thousand', ' Hundred', ''],
[number // 1000, number % 1000 // 100 % 10, number % 100])))
if len(parts) == 1:
return parts[0]
return ' and '.join([', '.join(parts[:-1]), parts[-1]])
if __name__ == '__main__':
doctest.testmod()
def englishify(number):
"""Format NUMBER into standard English form.
NUMBER must be in range [0..999999]
>>> englishify(0)
'Zero'
>>> englishify(10)
'Ten'
>>> englishify(20)
'Twenty'
>>> englishify(99)
'Ninety Nine'
>>> englishify(100)
'One Hundred'
>>> englishify(101)
'One Hundred and One'
>>> englishify(1001)
'One Thousand and One'
>>> englishify(1201)
'One Thousand, Two Hundred and One'
>>> englishify(123201)
'One Hundred and Twenty Three Thousand, Two Hundred and One'
"""
if number==0:
return 'Zero'
#Numbers 0-19 (unique numbers)
OneToNine= 'One Two Three Four Five Six Seven Eight Nine'.split()
TenToNineteen = 'Ten Eleven Twelve Thirteen Fourteen Fifteen Sixteen Seventeen Eighteen Nineteen'.split()
ZeroToNineteen = [''] + OneToNine + TenToNineteen
#Numbers >= 20 at intervals of 10
Tens = 'Twenty Thirty Forty Fifty Sixty Seventy Eighty Ninety'.split()
#1. Number from 1-19
if number < 20:
return ZeroToNineteen[number]
#2. Number from 20-99
if number < 100:
result = Tens[int(number/10)-2] + ' ' + ZeroToNineteen[int(number%10)]
return result.rstrip()
#3. Larger numbers - break down and englishify each part
parts = list(filter(None,
map(lambda quantity, number: englishify(number) + quantity if number else None,
[' Thousand', ' Hundred', ''],
[number // 1000, number % 1000 // 100, number % 100])))
if len(parts) == 1:
return parts[0]
return ' and '.join([', '.join(parts[:-1]), parts[-1]])
if __name__ == '__main__':
doctest.testmod()
def englishify(number):
"""Format NUMBER into standard English form.
NUMBER must be in range [0..999999]
>>> englishify(0)
'Zero'
>>> englishify(10)
'Ten'
>>> englishify(20)
'Twenty'
>>> englishify(99)
'Ninety Nine'
>>> englishify(100)
'One Hundred'
>>> englishify(101)
'One Hundred and One'
>>> englishify(1001)
'One Thousand and One'
>>> englishify(1201)
'One Thousand, Two Hundred and One'
>>> englishify(123201)
'One Hundred and Twenty Three Thousand, Two Hundred and One'
"""
Units = [None, 'One', 'Two', 'Three', 'Four', 'Five',
'Six', 'Seven', 'Eight', 'Nine',
'Ten', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen',
'Sixteen', 'Seventeen', 'Eighteen', 'Nineteen']
Tens = [None, None, 'Twenty', 'Thirty', 'Forty', 'Fifty',
'Sixty', 'Seventy', 'Eighty', 'Ninety']
if number < 20:
return Units[number] or 'Zero'
if number < 100:
return ' '.join(filter(None, [Tens[number//10], Units[number%10]]))
# Larger numbers - break down and englishify each part
parts = list(filter(None,
map(lambda quantity, number: englishify(number) + quantity if number else None,
[' Thousand', ' Hundred', ''],
[number // 1000, number // 100 % 10, number % 100])))
if len(parts) == 1:
return parts[0]
return ' and '.join([', '.join(parts[:-1]), parts[-1]])
if __name__ == '__main__':
doctest.testmod()
- 87.8k
- 14
- 104
- 325