Ordinal numbers replacement Ordinal numbers replacement python python

Ordinal numbers replacement


Here's a terse solution taken from Gareth on codegolf:

ordinal = lambda n: "%d%s" % (n,"tsnrhtdd"[(n//10%10!=1)*(n%10<4)*n%10::4])

Works on any number:

print([ordinal(n) for n in range(1,32)])['1st', '2nd', '3rd', '4th', '5th', '6th', '7th', '8th', '9th', '10th', '11th', '12th', '13th', '14th', '15th', '16th', '17th', '18th', '19th', '20th', '21st', '22nd', '23rd', '24th', '25th', '26th', '27th', '28th', '29th', '30th', '31st']


If you don't want to pull in an additional dependency on an external library (as suggested by luckydonald) but also don't want the future maintainer of the code to haunt you down and kill you (because you used golfed code in production) then here's a short-but-maintainable variant:

def make_ordinal(n):    '''    Convert an integer into its ordinal representation::        make_ordinal(0)   => '0th'        make_ordinal(3)   => '3rd'        make_ordinal(122) => '122nd'        make_ordinal(213) => '213th'    '''    n = int(n)    suffix = ['th', 'st', 'nd', 'rd', 'th'][min(n % 10, 4)]    if 11 <= (n % 100) <= 13:        suffix = 'th'    return str(n) + suffix


How about this:

suf = lambda n: "%d%s"%(n,{1:"st",2:"nd",3:"rd"}.get(n if n<20 else n%10,"th"))print [suf(n) for n in xrange(1,32)]['1st', '2nd', '3rd', '4th', '5th', '6th', '7th', '8th', '9th', '10th', '11th', '12th', '13th', '14th', '15th', '16th', '17th', '18th', '19th', '20th', '21st', '22nd', '23rd', '24th', '25th', '26th', '27th', '28th', '29th', '30th', '31st']