Форум сайта python.su
Здравствуйте!
Есть ли какая-нибудь библиотека, которой можно подать на вход объект datetime или timedelta, а на выходе получать строки такого вида:
"1 день 2 часа 15 минут“, ”28 минут 17 секунд“, ”53 секунды" и т.д.
Вроде понятно, как можно самому это сделать, но возня с падежами для разных числительных немного пугает, и если это уже где-то сделано, не хотелось бы велосипедить.
Офлайн
После некоторых размышлений понял, что при моих запросах никакая библиотека не поможет, и написал сам.
Выглядит страшновато, но сходу не знаю, как заменить эти бесконечные if'ы на что-то более изящное:
def seconds_to_rus(seconds_in: float): GROUPS = {1:1, 2:2, 3:2, 4:2, 5:5, 6:5, 7:5, 8:5, 9:5, 0:5} HOURS = {1: "час", 2: "часа", 5: "часов"} MINUTES = {1: "минута", 2: "минуты", 5: "минут"} SECONDS = {1: "секунда", 2: "секунды", 5: "секунд"} if seconds_in < 0.1: return "0.1 секунды" if seconds_in < 1: return "%.1f секунды" % seconds_in if seconds_in < 1.1: return "1 секунда" if seconds_in < 2: return "%.1f секунды" % seconds_in if seconds_in < 2.1: return "2 секунды" if seconds_in < 3: return "%.1f секунды" % seconds_in seconds_in = int(round(seconds_in)) seconds_1 = seconds_in % 10 if seconds_in < 60: # 1 минута return "%d %s" % (seconds_in, SECONDS[GROUPS[seconds_1]]) if seconds_in < 300: # 5 минут minutes_in = int(seconds_in / 60.0) minutes_1 = minutes_in % 10 seconds_in %= 60 if seconds_in: return "%d %s %d %s" % (minutes_in, MINUTES[GROUPS[minutes_1]], seconds_in, SECONDS[GROUPS[seconds_1]]) else: return "%d %s" % (minutes_in, MINUTES[GROUPS[minutes_1]]) minutes_in = int(round(seconds_in / 60.0)) minutes_1 = minutes_in % 10 if minutes_in < 60: # 1 час return "%d %s" % (minutes_in, MINUTES[GROUPS[minutes_1]]) else: hours_in = int(minutes_in / 60.0) hours_1 = hours_in % 10 minutes_in %= 60 if minutes_in: return "%d %s %d %s" % (hours_in, HOURS[GROUPS[hours_1]], minutes_in, MINUTES[GROUPS[minutes_1]]) else: return "%d %s" % (hours_in, HOURS[GROUPS[hours_1]])
Отредактировано Striver (Июнь 10, 2019 15:28:29)
Офлайн
Офлайн