date序号输出?

我想知道是否有一个快速和简单的方法来输出序号在python中的数字。

例如,给定数字1 ,我想输出"1st" ,数字2"2nd"等等。

这是与面包屑path中的date

 Home > Venues > Bar Academy > 2009 > April > 01 

是目前显示的

我想有一些事情

 Home > Venues > Bar Academy > 2009 > April > 1st 

或者缩短大卫的答案:

 if 4 <= day <= 20 or 24 <= day <= 30: suffix = "th" else: suffix = ["st", "nd", "rd"][day % 10 - 1] 

这是一个更一般的解决scheme:

 def ordinal(n): if 10 <= n % 100 < 20: return str(n) + 'th' else: return str(n) + {1 : 'st', 2 : 'nd', 3 : 'rd'}.get(n % 10, "th") 

不知道5年前,当你问这个问题的时候它是否存在,但是inflect包有一个function可以做你正在寻找的东西:

 >>> import inflect >>> p = inflect.engine() >>> for i in range(1,32): ... print p.ordinal(i) ... 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 

这里它使用字典作为一个函数或作为一个lambda …

如果你看后面的字典,你可以阅读它…

一切都以'th'结尾

…除非以1,2或3结尾,否则以“st”,“nd”或“rd”结尾,

…除非它以11,12或13结束,那么它以'th','th'或'th'结尾,

 # as a function def ordinal(num): return '%d%s' % (num, { 11: 'th', 12: 'th', 13: 'th' }.get(num % 100, { 1: 'st',2: 'nd',3: 'rd',}.get(num % 10, 'th'))) # as a lambda ordinal = lambda num : '%d%s' % (num, { 11: 'th', 12: 'th', 13: 'th' }.get(num % 100, { 1: 'st',2: 'nd',3: 'rd',}.get(num % 10, 'th'))) 

一个更一般和更短的解决scheme(作为一个function):

 def get_ordinal(num) ldig = num % 10 l2dig = (num // 10) % 10 if (l2dig == 1) or (ldig > 3): return '%d%s' % (num, 'th') else: return '%d%s' % (num, {1: 'st', 2: 'nd', 3: 'rd'}.get(ldig)) 

我刚刚结合了David的解决scheme和库(就像deegeedubs那样)。 你甚至可以replace真正的mathvariables(ldig,l2dig)(因为l2dig只能使用一次),那么你会得到四行代码。

除了第一,第二和第三,我想他们都只是添加第四,第五,第六,第十一,第二十一…哦,哎呀;-)

我认为这可能工作:

 def ordinal(num): ldig = num % 10 l2dig = (num // 10) % 10 if l2dig == 1: suffix = 'th' elif ldig == 1: suffix = 'st' elif ldig == 2: suffix = 'nd' elif ldig == 3: suffix = 'rd' else: suffix = 'th' return '%d%s' % (num, suffix) 
 def ordinal(n): return ["th", "st", "nd", "rd"][n%10 if n%10<4 and not (10<n%100<14) else 0] 

这是一个更短的通用解决scheme:

 def foo(n): return str(n) + {1: 'st', 2: 'nd', 3: 'rd'}.get(4 if 10 <= n % 100 < 20 else n % 10, "th") 

虽然上面的其他解决scheme乍一看可能更容易理解,但是使用less一点的代码就可以工作。

固定的负input,基于eric.frederich的不错的sol'n(只是在使用%时添加了abs ):

 def ordinal(num): return '%d%s' % (num, { 11: 'th', 12: 'th', 13: 'th'}.get(abs(num) % 100, { 1: 'st',2: 'nd',3: 'rd',}.get(abs(num) % 10, 'th'))) 

我想使用序号为我的项目,并在几个原型后,我认为这种方法,虽然不小,将工作任何正整数,是任何整数。

它通过确定数字大于或小于20来工作,如果数字小于20,则将int 1变成string1st,2,2nd; 3,3; 其余的将会有“st”join其中。

对于超过20的数字,将采取倒数第二位数字,我已经分别称为十位和单位,并testing他们看看要添加到数字。

这是在python的方式,所以我不知道如果其他语言将能够findstring的最后或倒数第二个数字,如果他们这样做应该很容易翻译。

 def o(numb): if numb < 20: #determining suffix for < 20 if numb == 1: suffix = 'st' elif numb == 2: suffix = 'nd' elif numb == 3: suffix = 'rd' else: suffix = 'th' else: #determining suffix for > 20 tens = str(numb) tens = tens[-2] unit = str(numb) unit = unit[-1] if tens == "1": suffix = "th" else: if unit == "1": suffix = 'st' elif unit == "2": suffix = 'nd' elif unit == "3": suffix = 'rd' else: suffix = 'th' return str(numb)+ suffix 

为了方便使用,我调用了函数“o”,并且可以通过导入我通过导入ordinal然后ordinal.o(number)调用“ordinal”的文件名来调用。

让我知道你的想法:D

PS我已经发布了这个答案在另一个序号的问题,但认识到这一个更适用考虑它的python。

我不得不从javascript转换一个脚本,我有一个有用的FN复制PHPSdateOBJ。 非常相似

 def ord(n): return str(n)+("th" if 4<=n%100<=20 else {1:"st",2:"nd",3:"rd"}.get(n%10, "th")) 

这与我的date样式绑定:

 def dtStylish(dt,f): return dt.strftime(f).replace("{th}", ord(dt.day)) 

PS – 我从另一个线程得到这里被报告为重复,但它不完全是因为该线程也处理date问题

这是我写的一个函数,作为我写的一个日历types的程序的一部分(我不包括整个程序)。 它增加了大于0的任何数字的正确序数。我包含一个循环来演示输出。

 def ordinals(num): # st, nums ending in '1' except '11' if num[-1] == '1' and num[-2:] != '11': return num + 'st' # nd, nums ending in '2' except '12' elif num[-1] == '2' and num[-2:] != '12': return num + 'nd' # rd, nums ending in '3' except '13' elif num[-1] == '3' and num[-2:] != '13': return num + 'rd' # th, all other nums else: return num + 'th' data = '' # print the first 366 ordinals (for leap year) for i in range(1, 367): data += ordinals(str(i)) + '\n' # print results to file with open('ordinals.txt', 'w') as wf: wf.write(data) 

这些天我会用Arrow http://arrow.readthedocs.io/en/latest/ (肯定不会在09年)

 >>> import arrow >>> from datetime import datetime >>> arrow.get(datetime.utcnow()).format('Do') '27th' 

我做了一个似乎在这种情况下工作的函数。 只要传入一个date对象,它就会使用这一天来计算出后缀。 希望它有帮助

 from datetime import date def get_day_ordinal(d): sDay = '%dth' if d.day <= 10 or d.day >= 21: sDay = '%dst' if d.day % 10 == 1 else sDay sDay = '%dnd' if d.day % 10 == 2 else sDay sDay = '%drd' if d.day % 10 == 3 else sDay return sDay % d.day d = date.today() print get_day_ordinal(d)