Ой, ребята, посмотрел на ваши решения, и понял, что самому надо написать. :-)
# coding: cp1251
from __future__ import division
ZERO = "ноль"
L_1_HE = HE = [ZERO, "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять", "десять",
"одинадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать",
"шестнадцать", "семнадцать", "восемнадцать", "девятнадцать"]
L_1_SHE = SHE = [ZERO, "одна", "две"] + L_1_HE[3:]
L_10 = [ZERO, "десять", "двадцать", "тридцать", "сорок", "пятьдесят",
"шестьдесят", "семьдесят", "восемьдесят", "девяносто"]
L_100 = [ZERO, "сто", "двести", "триста", "четыреста", "пятьсот",
"шестьсот", "семьсот", "восемьсот", "девятьсот"]
N_ROUBLE = "рубл"
N_COP = "копе"
RUR = (N_ROUBLE, N_COP)
N_DOLLAR = "доллар"
N_CENT = "цент"
USD = (N_DOLLAR, N_CENT)
GENDER = {
N_ROUBLE: HE,
N_COP: SHE,
N_DOLLAR: HE,
N_CENT: HE,
}
N_1000 = "тысяч"
N_MILLION = "миллион"
N_BILLION = "миллиард"
ENDINGS = {
N_ROUBLE: ["ей", "ь", "я", "я", "я"] + 30 * ["ей"],
N_COP: ["ек", "йка", "йки", "йки", "йки"] + 30 * ["ек"],
N_DOLLAR: ["ов", "", "а", "а", "а"] + 30 * ["ов"],
N_CENT: ["ов", "", "а", "а", "а"] + 30 * ["ов"],
N_1000: ["", "а", "и", "и", "и"] + 30 * [""],
N_MILLION: ["ов", "", "а", "а", "а"] + 30 * ["ов"],
N_BILLION: ["ов", "", "а", "а", "а"] + 30 * ["ов"],
}
def write_1_to_999(n, gender_digits=HE):
assert n<=999
if n==0:
return ZERO
n_100 = n // 100
n_10 = n % 100 // 10
n_1 = n % 10
res = []
res.append(L_100[n_100])
if n_10 == 1:
res.append(gender_digits[10*n_10 + n_1])
else:
res.append(L_10[n_10])
res.append(gender_digits[n_1])
return " ".join([s for s in res if s != ZERO])
def ending_index(n):
n_2 = n % 100
return n_2 if n_2 < 20 else n_2 % 10
def form_group_name(group, n):
return group + ENDINGS[group][ending_index(n)]
def form_group(group, n, gender_digits=HE):
return ("%s %s" % (write_1_to_999(n, gender_digits), form_group_name(group, n))) if n else ZERO
def write_number(n, gender_digits=HE):
assert type(n) in (int, long)
if n==0:
return ZERO
n_3 = n % 10**3
n_6 = n % 10**6 // 10**3
n_9 = n % 10**9 // 10**6
n_12 = n % 10**12 // 10**9
#print n_12, n_9, n_6, n_3
res = []
res.append(form_group(N_BILLION, n_12))
res.append(form_group(N_MILLION, n_9))
res.append(form_group(N_1000, n_6, SHE))
res.append(write_1_to_999(n_3, gender_digits))
return ", ".join([s for s in res if s != ZERO])
def write_price(n_rub, n_cop=0, currency=RUR):
rub_id, cop_id = currency
n = int(n_rub)
res = []
res.append("%s %s" % (write_number(n, GENDER[rub_id]), form_group_name(rub_id, n)))
res.append(form_group(cop_id, n_cop, GENDER[cop_id]))
return " и ".join([s for s in res if s != ZERO])
if __name__ == "__main__":
print write_price(11082, 72)
print write_price(11082, 72, USD)
print write_price(900301841123, 452, currency=USD)
print write_price(0)
print write_price(103)
print write_price(103, 21)
print write_price(103, 21, USD)
print write_price(100000000, 21, USD)
print write_price(10000000000, 17, USD)
print write_price(10000000017, 29, USD)
Преимущества этого кода в том, что код и данные полностью раздельно, что облегчает расширение по валютам. Как видите, я без труда добавил доллары. Собственно вот что я имел в виду, насчет того, как следует писать на питоне.