Дата Порядковый Выход? - PullRequest
       23

Дата Порядковый Выход?

20 голосов
/ 11 апреля 2009

Мне интересно, есть ли быстрый и простой способ вывода ординалов с заданным числом в python.

Например, учитывая число 1, я хотел бы вывести "1st", число 2, "2nd", и так далее, и так далее.

Это для работы с датами в хлебной крошке

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

- это то, что в данный момент отображается

Я бы хотел иметь что-то вроде

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

Ответы [ 14 ]

35 голосов
/ 11 апреля 2009

Или сократите ответ Давида:

if 4 <= day <= 20 or 24 <= day <= 30:
    suffix = "th"
else:
    suffix = ["st", "nd", "rd"][day % 10 - 1]
29 голосов
/ 11 апреля 2009

Вот более общее решение:

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")
12 голосов
/ 10 февраля 2014

Не уверен, существовал ли он 5 лет назад, когда вы задавали этот вопрос, но пакет inflect имеет функцию, которая делает то, что вы ищете:

>>> 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
2 голосов
/ 27 мая 2016

В эти дни я бы использовал Arrow http://arrow.readthedocs.io/en/latest/ (которого точно не было в '09)

>>> import arrow
>>> from datetime import datetime
>>> arrow.get(datetime.utcnow()).format('Do')
'27th'
2 голосов
/ 10 января 2013

Более общее и короткое решение (как функция):

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

Я только что объединил решения и библиотеки Дэвида (как это сделал deegeedubs). Вы даже можете заменить переменные (ldig, l2dig) для реальной математики (поскольку l2dig используется только один раз), тогда вы получите четыре строки кода.

2 голосов
/ 10 февраля 2010

Здесь он использует словари как функцию или как лямбду ...

Если вы посмотрите на словари в обратном направлении, вы можете прочитать их как ...

Все заканчивается на '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')))
1 голос
/ 31 августа 2017

Я сделал функцию, которая работает в этом случае. Просто передайте объект даты, и он будет использовать день для определения суффикса. Надеюсь, это поможет

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)
1 голос
/ 15 января 2014
def ordinal(n):
    return ["th", "st", "nd", "rd"][n%10 if n%10<4 and not (10<n%100<14) else 0]
1 голос
/ 11 апреля 2009

За исключением 1-го, 2-го и 3-го, я думаю, что они все просто добавляют th ... 4-е, 5-е, 6-е, 11-е, 21-е ... ох, ой; -)

Я думаю, это может сработать:

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)
0 голосов
/ 10 апреля 2015

Вот функция, которую я написал как часть программы типа календаря, которую я написал (я не включаю всю программу). Он добавляет правильный порядковый номер для любого числа больше 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...