@Guerro69

Python как определить правильный падеж?

Я написал код, который показывает время работы моего компьютера в днях, часах, минутах, секундах.
И мой код так и отображает это, например: "2 дней 9 часов 57 минут 41 секунд"
Но "2 дней" и "41 секунд" звучит как то глупо, есть ли самый рациональный способ исправить это?
Вот мой код:
import uptime as upt

m, s = divmod(upt.uptime(), 60)
h, m = divmod(m, 60)
d, h = divmod(h, 24)
print(f"{int(d)} дней {int(h)} часов {int(m)} минут {int(s)} секунд")
  • Вопрос задан
  • 2801 просмотр
Решения вопроса 3
Sergei_Erjemin
@Sergei_Erjemin
Улыбайся, будь самураем...
Есть отличная Python-библиотека pytils для работы с числительными и падежами вокруг них (в ней ещё много полезного есть)

Твой код будет выглядеть примерно так:
from pytils import numeral
import uptime as upt

m, s = divmod(upt.uptime(), 60)
h, m = divmod(m, 60)
d, h = divmod(h, 24)
print("%s %s %s %s" % (
    numeral.get_plural(d, "день, дня, дней"),
    numeral.get_plural(h, "час, часа, часов"),
    numeral.get_plural(m, "минута, минуты, минут"),
    numeral.get_plural(s, "секунда, секунды, секунд")
    )
)
Ответ написан
Комментировать
@bbkmzzzz
Обратиться к грамматике)
1. После числительного один и составных числительных, оканчивающихся на один, ставится существительное в именительном падеже.

2. После числительных два, три, четыре и составных числительных, оканчивающихся на два, три, четыре, ставится существительное в родительном падеже единственного числа.

3. После числительного пять, шесть и т.д. и после слов много, мало, несколько, сколько и т.д. ставится существительное в родительном падеже множественного числа.


И про ноль не забываем
Ответ написан
Комментировать
@DimkaI
Системный адинистратор, разработчик ПО
Вроде это здесь уже обсуждалось.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
gnifajio
@gnifajio
Совершенствуюсь каждый день
Вот выжимка из pytils-safe 0.3.2.

Зачем ставить целую библиотеку (которая еще и написана через одно место)?

def get_plural(amount, variants, absence=None):
    assert len(variants) == 3
    amount = abs(amount)

    if amount % 10 == 1 and amount % 100 != 11:
        variant = 0
    elif 2 <= amount % 10 <= 4 and (amount % 100 < 10 or amount % 100 >= 20):
        variant = 1
    else:
        variant = 2

    plural = variants[variant]

    if amount or absence is None:
        return "%d %s" % (amount, plural)
    else:
        return absence
Ответ написан
Комментировать
YuriyVorobyov1333
@YuriyVorobyov1333
Software Developer
Напишите условие для дней, часов, минут и секунд, например:
def days_word(d):
  if (d == 1):
    return 'день'
  if (2 <= d < 5):
    return 'дня'
  else:
    return 'дней' 

string = "{} {}".format(int(d), days_word(int(d)))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы