Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2024, 08:01   #1
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию Преобразование числа в строку 1=один

здравствуйте, код:
Код:
def in_to_st(i):
    d = {1: 'один', 2: 'два', 3: 'три', 4: 'четыре', 5: 'пять', 6: 'шесть', 7: 'семь', 8: 'восемь', 9: 'девять',
         10: 'десять', 11: 'одиннадцать', 12: 'двенадцать', 13: 'тринадцать', 14: 'четырнадцать', 15: 'пятнадцать', 16: 'шестнадцать', 17: 'семнадцать', 18: 'восемнадцать', 19: 'девятнадцать',
         20: 'двадцать', 30: 'тридцать', 40: 'сорок', 50: 'пятьдесят', 60: 'шестьдесят', 70: 'семьдесят', 80: 'восемьдесят', 90: 'девяносто',
         100: 'сто', 200: 'двести', 300: 'триста', 400: 'четыреста', 500: 'пятьсот', 600: 'шестьсот', 700: 'семьсот', 800: 'восемьсот', 900: 'девятьсот', }
    hundreds = (i // 100) * 100
    tens = ((i % 100) // 10) * 10
    units = i % 10
    w_hundreds = d.get(hundreds, '')
    w_tens = ''
    if tens == 10:
        w_tens = d.get(tens + units)
    else:
        w_tens = d.get(tens, '')
    w_units = ''
    if tens != 10:
        w_units = d.get(units)
    if i == 0:
        number = 'ноль'
    else: number = " ".join([s for s in [w_hundreds, w_tens, w_units] if s])
    return number

for i in range(0, 1000): # будет ДО 1000, последнее значение 999
    in_to_st_i = str(in_to_st(i))
    # print(in_to_st_i)
по миллион включительно кто сможет продлить функцию def in_to_st?
и по хорошему наверное для этого есть модуль, есть?
Ципихович Эндрю вне форума Ответить с цитированием
Старый 19.01.2024, 12:28   #2
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
наверное для этого есть модуль, есть?
вроде есть:
Код:
from num2words import num2words # pip install num2words

# пример использования
number = 12345
text = num2words(number, lang='ru')
print(text)
ещё не проверил
Ципихович Эндрю вне форума Ответить с цитированием
Старый 19.01.2024, 12:38   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Побаловался.
Нашёл пример и подправил до < 21000:
Код:
WORDS  = ['ноль', 'один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять', 
          'десять', 'одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать',
          'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать',
          'двадцать', 'тридцать', 'сорок', 'пятьдесят',
          'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто',
          'сто', 'двести', 'триста', 'четыреста', 'пятьсот',
          'шестьсот', 'семьсот', 'восемьсот', 'девятьсот']
THOUSAND = ['тысяч' ,'одна тысяча', 'две тысячи', 'три тысячи', 'четыре тысячи', 'тысяч']
 
def chislo_slovami(num):
    ones = num % 10
    if num <= 19:
        return WORDS[num]
    elif 19 < num < 100:
        if ones:
            return " ".join((WORDS[18 + num // 10], WORDS[ ones]))
        else:
            return " ".join(WORDS[18 + num // 10])
    elif 100 < num < 1000:
        part = chislo_slovami(num % 100)
        return " ".join((WORDS[27 + num // 100], part))
    elif 1000 <= num < 21000:
        part1 = chislo_slovami(num % 1000)
        if num // 1000 <= 4:
            return " ".join((THOUSAND[num // 1000], part1))
        else:
            part2 = chislo_slovami(num // 1000) 
            return " ".join((part2, THOUSAND[5], part1))

chislo_slovami(1937)
Вроде как работает. Тут с рекурсиями.

Ципихович Эндрю
Цитата:
и по хорошему наверное для этого есть модуль, есть?
Модуль есть, и не один, но как там с русификацией ??

PS: Есть и такое предложение:
Код:
pip install n2w
Но также не пробовал :-)
Как-то так, ...

Последний раз редактировалось ViktorR; 19.01.2024 в 12:42.
ViktorR вне форума Ответить с цитированием
Старый 19.01.2024, 12:59   #4
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Модуль есть, и не один, но как там с русификацией ??
гут
выложенный пример в посту № 2 отработало как двенадцать тысяч триста сорок пять
Ципихович Эндрю вне форума Ответить с цитированием
Старый 19.01.2024, 13:16   #5
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

по миллион включительно, преобразование с проверкой
Код:
def st_to_in(in_to_st_i):
    number_word_dict = {
        "ты": 1000, "м": 1000000,
        "сто": 100, "двес": 200, "трис": 300, "четырес": 400, "пятьс": 500, "шестьс": 600, "семьс": 700, "восемьс": 800, "девятьс": 900,
        "одинн": 11, "двен": 12, "трин": 13, "четырн": 14, "пятн": 15, "шестн": 16, "семн": 17, "восемн": 18, "девятн": 19,
        "двад": 20, "трид": 30, "сор": 40, "пятьд": 50, "шестьд": 60, "семьд": 70, "восемьд": 80, "девяно": 90,
        "дес": 10, "н": 0, "о": 1, "дв": 2, "т": 3, "ч": 4, "п": 5, "ш": 6, "с": 7, "в": 8, "д": 9, }
    words = in_to_st_i.split()
    number = 0
    thousands = 0
    millions = 0
    for word in words:
        for key, value in number_word_dict.items():
            if word.startswith(key):
                if key == "ты":
                    thousands = number
                    number = 0
                elif key == "м":
                    millions = number
                    number = 0
                else:
                    number += value
                break
    number += thousands * 1000 + millions * 1000000
    if number > 1000000:
        print('Ввели слишком большое число')
        return None
    return number
print('Начало')
from num2words import num2words # pip install num2words num преобразовывает в words
for i in range(0, 1000001): # будет ДО 1000001, последнее значение 1000000
    in_to_st_i = (num2words(str(i), lang='ru'))
    # print(type(in_to_st_i), in_to_st_i)
    st_to_in_i = st_to_in(in_to_st_i)
    # print(type(st_to_in_i), st_to_in_i)
    if i != st_to_in_i:
        print(f'{in_to_st_i} != {st_to_in_i}')
        exit(0)
    # else: print(f'{in_to_st_i} = {st_to_in_i}')
print('Конец')
Ципихович Эндрю вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование числа в строку. Sonny01 Помощь студентам 5 15.01.2015 19:16
Преобразование int числа в строку apeorin Общие вопросы C/C++ 5 18.12.2012 23:55
преобразование числа в строку Mortimoro PHP 4 04.10.2012 21:09
Преобразование числа в строку )Игнат( Общие вопросы Delphi 6 06.07.2008 09:32