Skip to main content
Code Review

Return to Answer

Commonmark migration
Source Link

#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()
Updated new code
Source Link
Toby Speight
  • 87.8k
  • 14
  • 104
  • 325

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().

Updated new code
Source Link
Toby Speight
  • 87.8k
  • 14
  • 104
  • 325
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()
Show example of formatting parts separately and then joining
Source Link
Toby Speight
  • 87.8k
  • 14
  • 104
  • 325
Loading
added 20 characters in body
Source Link
Toby Speight
  • 87.8k
  • 14
  • 104
  • 325
Loading
Source Link
Toby Speight
  • 87.8k
  • 14
  • 104
  • 325
Loading
lang-py

AltStyle によって変換されたページ (->オリジナル) /