# -*- coding: utf-8 -*- # Copyright (c) 2003, Taro Ogawa. All Rights Reserved. # Copyright (c) 2013, Savoir-faire Linux inc. All Rights Reserved. # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # MA 02110-1301 USA from __future__ import unicode_literals from .base import Num2Word_Base from .utils import get_digits, splitbyx ZERO = ('нуль',) ONES_FEMININE = { 1: ('одна', "однієї", "одній", "одну", "однією", "одній"), 2: ('дві', "двох", "двом", "дві", "двома", "двох"), 3: ('три', "трьох", "трьом", "три", "трьома", "трьох"), 4: ('чотири', "чотирьох", "чотирьом", "чотири", "чотирма", "чотирьох"), 5: ('п\'ять', "п'яти", "п'яти", "п'ять", "п'ятьма", "п'яти"), 6: ('шість', "шести", "шести", "шість", "шістьма", "шести"), 7: ('сім', "семи", "семи", "сім", "сьома", "семи"), 8: ('вісім', "восьми", "восьми", "вісім", "вісьма", "восьми"), 9: ("дев'ять", "дев'яти", "дев'яти", "дев'ять", "дев'ятьма", "дев'яти"), } ONES = { 1: ('один', 'одного', "одному", "один", "одним", "одному"), 2: ('два', 'двох', "двом", "два", "двома", "двох"), 3: ('три', 'трьох', "трьом", "три", "трьома", "трьох"), 4: ('чотири', 'чотирьох', "чотирьом", "чотири", "чотирма", "чотирьох"), 5: ('п\'ять', "п'яти", "п'яти", "п'ять", "п'ятьма", "п'яти"), 6: ('шість', 'шести', "шести", "шість", "шістьма", "шести"), 7: ('сім', 'семи', "семи", "сім", "сьома", "семи"), 8: ('вісім', 'восьми', "восьми", "вісім", "вісьма", "восьми"), 9: ("дев'ять", "дев'яти", "дев'яти", "дев'ять", "дев'ятьма", "дев'яти"), } ONES_ORDINALS = { 1: ("перший", "одно"), 2: ("другий", "двох"), 3: ("третій", "трьох"), 4: ("четвертий", "чотирьох"), 5: ("п'ятий", "п'яти"), 6: ("шостий", "шести"), 7: ("сьомий", "семи"), 8: ("восьмий", "восьми"), 9: ("дев'ятий", "дев'яти"), 10: ("десятий", "десяти"), 11: ("одинадцятий", "одинадцяти"), 12: ("дванадцятий", "дванадцяти"), 13: ("тринадцятий", "тринадцяти"), 14: ("чотирнадцятий", "чотирнадцяти"), 15: ("п'ятнадцятий", "п'ятнадцяти"), 16: ("шістнадцятий", "шістнадцяти"), 17: ("сімнадцятий", "сімнадцяти"), 18: ("вісімнадцятий", "вісімнадцяти"), 19: ("дев'ятнадцятий", "дев'ятнадцяти"), } TENS = { 0: ('десять', 'десяти', "десяти", "десять", "десятьма", "десяти"), 1: ('одинадцять', 'одинадцяти', "одинадцяти", "одинадцять", "одинадцятьма", "одинадцяти"), 2: ('дванадцять', 'дванадцяти', "дванадцяти", "дванадцять", "дванадцятьма", "дванадцяти"), 3: ('тринадцять', 'тринадцяти', "тринадцяти", "тринадцять", "тринадцятьма", "тринадцяти"), 4: ('чотирнадцять', 'чотирнадцяти', "чотирнадцяти", "чотирнадцять", "чотирнадцятьма", "чотирнадцяти"), 5: ("п'ятнадцять", "п'ятнадцяти", "п'ятнадцяти", "п'ятнадцять", "п'ятнадцятьма", "п'ятнадцяти"), 6: ('шістнадцять', 'шістнадцяти', "шістнадцяти", "шістнадцять", "шістнадцятьма", "шістнадцяти"), 7: ('сімнадцять', 'сімнадцяти', "сімнадцяти", "сімнадцять", "сімнадцятьма", "сімнадцяти"), 8: ('вісімнадцять', 'вісімнадцяти', "вісімнадцяти", "вісімнадцять", "вісімнадцятьма", "вісімнадцяти"), 9: ("дев'ятнадцять", "дев'ятнадцяти", "дев'ятнадцяти", "дев'ятнадцять", "дев'ятнадцятьма", "дев'ятнадцяти"), } TWENTIES = { 2: ('двадцять', "двадцяти", "двадцяти", "двадцять", "двадцятьма", "двадцяти"), 3: ('тридцять', "тридцяти", "тридцяти", "тридцять", "тридцятьма", "тридцяти"), 4: ('сорок', "сорока", "сорока", "сорок", "сорока", "сорока"), 5: ('п\'ятдесят', "п'ятдесяти", "п'ятдесяти", "п'ятдесят", "п'ятдесятьма", "п'ятдесяти"), 6: ('шістдесят', "шістдесяти", "шістдесяти", "шістдесят", "шістдесятьма", "шістдесяти"), 7: ('сімдесят', "сімдесяти", "сімдесяти", "сімдесят", "сімдесятьма", "сімдесяти"), 8: ('вісімдесят', "вісімдесяти", "вісімдесяти", "вісімдесят", "вісімдесятьма", "вісімдесяти"), 9: ('дев\'яносто', "дев'яноста", "дев'яноста", "дев'яносто", "дев'яностами", "дев'яноста"), } TWENTIES_ORDINALS = { 2: ("двадцятий", "двадцяти"), 3: ("тридцятий", "тридцяти"), 4: ("сороковий", "сорока"), 5: ("п'ятдесятий", "п'ятдесяти"), 6: ("шістдесятий", "шістдесяти"), 7: ("сімдесятий", "сімдесяти"), 8: ("вісімдесятий", "вісімдесяти"), 9: ("дев'яностий", "дев'яности"), } HUNDREDS = { 1: ('сто', "ста", "ста", "сто", "стами", "стах"), 2: ('двісті', "двохста", "двомстам", "двісті", "двомастами", "двохстах"), 3: ('триста', "трьохста", "трьомстам", "триста", "трьомастами", "трьохстах"), 4: ('чотириста', "чотирьохста", "чотирьомстам", "чотириста", "чотирмастами", "чотирьохстах"), 5: ('п\'ятсот', "п'ятиста", "п'ятистам", "п'ятсот", "п'ятьмастами", "п'ятистах"), 6: ('шістсот', "шестиста", "шестистам", "шістсот", "шістьмастами", "шестистах"), 7: ('сімсот', "семиста", "семистам", "сімсот", "сьомастами", "семистах"), 8: ('вісімсот', "восьмиста", "восьмистам", "вісімсот", "восьмастами", "восьмистах"), 9: ("дев'ятсот", "дев'ятиста", "дев'ятистам", "дев'ятсот", "дев'ятьмастами", "дев'ятистах"), } HUNDREDS_ORDINALS = { 1: ("сотий", "сто"), 2: ("двохсотий", "двохсот"), 3: ("трьохсотий", "трьохсот"), 4: ("чотирьохсотий", "чотирьохсот"), 5: ("п'ятисотий", "п'ятсот"), 6: ("шестисотий", "шістсот"), 7: ("семисотий", "сімсот"), 8: ("восьмисотий", "вісімсот"), 9: ("дев'ятисотий", "дев'ятсот"), } THOUSANDS = { # 10^3 1: (('тисяча', 'тисячі', 'тисяч'), ('тисячи', 'тисяч', 'тисяч'), ('тисячі', 'тисячам', 'тисячам'), ('тисячу', 'тисячі', 'тисяч'), ('тисячею', 'тисячами', 'тисячами'), ('тисячі', 'тисячах', 'тисячах'),), # 10^6 2: (('мільйон', 'мільйони', 'мільйонів'), ('мільйона', 'мільйонів', 'мільйонів'), ('мільйону', 'мільйонам', 'мільйонам'), ('мільйон', 'мільйони', 'мільйонів'), ('мільйоном', 'мільйонами', 'мільйонів'), ('мільйоні', 'мільйонах', 'мільйонах'),), # 10^9 3: (('мільярд', 'мільярди', 'мільярдів'), ('мільярда', 'мільярдів', 'мільярдів'), ('мільярду', 'мільярдам', 'мільярдам'), ('мільярд', 'мільярди', 'мільярдів'), ('мільярдом', 'мільярдами', 'мільярдів'), ('мільярді', 'мільярдах', 'мільярдах'),), # 10^12 4: (('трильйон', 'трильйони', 'трильйонів'), ('трильйона', 'трильйонів', 'трильйонів'), ('трильйону', 'трильйонам', 'трильйонам'), ('трильйон', 'трильйони', 'трильйонів'), ('трильйоном', 'трильйонами', 'трильйонів'), ('трильйоні', 'трильйонах', 'трильйонах'),), # 10^15 5: (('квадрильйон', 'квадрильйони', 'квадрильйонів'), ('квадрильйона', 'квадрильйонів', 'квадрильйонів'), ('квадрильйону', 'квадрильйонам', 'квадрильйонам'), ('квадрильйон', 'квадрильйони', 'квадрильйонів'), ('квадрильйоном', 'квадрильйонами', 'квадрильйонів'), ('квадрильйоні', 'квадрильйонах', 'квадрильйонах'),), # 10^18 6: (('квінтильйон', 'квінтильйони', 'квінтильйонів'), ('квінтильйона', 'квінтильйонів', 'квінтильйонів'), ('квінтильйону', 'квінтильйонам', 'квінтильйонам'), ('квінтильйон', 'квінтильйони', 'квінтильйонів'), ('квінтильйоном', 'квінтильйонами', 'квінтильйонів'), ('квінтильйоні', 'квінтильйонах', 'квінтильйонах'),), # 10^21 7: (('секстильйон', 'секстильйони', 'секстильйонів'), ('секстильйона', 'секстильйонів', 'секстильйонів'), ('секстильйону', 'секстильйонам', 'секстильйонам'), ('секстильйон', 'секстильйони', 'секстильйонів'), ('секстильйоном', 'секстильйонами', 'секстильйонів'), ('секстильйоні', 'секстильйонах', 'секстильйонах'),), # 10^24 8: (('септильйон', 'септильйони', 'септильйонів'), ('септильйона', 'септильйонів', 'септильйонів'), ('септильйону', 'септильйонам', 'септильйонам'), ('септильйон', 'септильйони', 'септильйонів'), ('септильйоном', 'септильйонами', 'септильйонів'), ('септильйоні', 'септильйонах', 'септильйонах'),), # 10^27 9: (('октильйон', 'октильйони', 'октильйонів'), ('октильйона', 'октильйонів', 'октильйонів'), ('октильйону', 'октильйонам', 'октильйонам'), ('октильйон', 'октильйони', 'октильйонів'), ('октильйоном', 'октильйонами', 'октильйонів'), ('октильйоні', 'октильйонах', 'октильйонах'),), # 10^30 10: (('нонільйон', 'нонільйони', 'нонільйонів'), ('нонільйона', 'нонільйонів', 'нонільйонів'), ('нонільйону', 'нонільйонам', 'нонільйонам'), ('нонільйон', 'нонільйони', 'нонільйонів'), ('нонільйоном', 'нонільйонами', 'нонільйонів'), ('нонільйоні', 'нонільйонах', 'нонільйонах'),), } prefixes_ordinal = { 1: "тисячний", 2: "мільйонний", 3: "мільярдний", 4: "трильйонний", 5: "квадрильйонний", 6: "квінтильйонний", 7: "секстильйонний", 8: "септильйонний", 9: "октильйонний", 10: "нонільйонний", } FEMININE_MONEY = ('AOA', 'BAM', 'BDT', 'BWP', 'CZK', 'DKK', 'ERN', 'HNL', 'HRK', 'IDR', 'INR', 'ISK', 'JPY', 'KPW', 'KRW', 'LKR', 'MOP', 'MRU', 'MUR', 'MVR', 'MWK', 'NGN', 'NIO', 'NOK', 'NPR', 'PKR', 'SCR', 'SEK', 'STN', 'TRY', 'WST', 'UAH', 'ZMW') FEMININE_CENTS = ('ALL', 'BDT', 'BGN', 'BYN', 'GHS', 'HRK', 'ILS', 'INR', 'NPR', 'OMR', 'OMR', 'PKR', 'RSD', 'RUB', 'UAH') GENERIC_DOLLARS = ('долар', 'долари', 'доларів') GENERIC_CENTS = ('цент', 'центи', 'центів') class Num2Word_UK(Num2Word_Base): CURRENCY_FORMS = { 'AED': ( ('дирхам', 'дирхами', 'дирхамів'), ('філс', 'філси', 'філсів') ), 'AFN': ( ('афгані', 'афгані', 'афгані'), ('пул', 'пули', 'пулів') ), 'ALL': ( ('лек', 'леки', 'леків'), ('кіндарка', 'кіндарки', 'кіндарок') ), 'AMD': ( ('драм', 'драми', 'драмів'), ('лум', 'лум', 'лум') ), 'ANG': ( ('гульден', 'гульдени', 'гульденів'), GENERIC_CENTS ), 'AOA': ( ('кванза', 'кванзи', 'кванз'), ('сентимо', 'сентимо', 'сентимо') ), 'ARS': ( ('песо', 'песо', 'песо'), ('сентаво', 'сентаво', 'сентаво') ), 'AUD': (GENERIC_DOLLARS, GENERIC_CENTS), 'AWG': ( ('флорин', 'флорини', 'флоринів'), GENERIC_CENTS ), 'AZN': ( ('манат', 'манати', 'манатів'), ('гяпік', 'гяпіки', 'гяпіків') ), 'BAM': ( ('марка', 'марки', 'марок'), ('фенінг', 'фенінги', 'фенінгів') ), 'BBD': (GENERIC_DOLLARS, GENERIC_CENTS), 'BDT': ( ('така', 'таки', 'так'), ('пойша', 'пойші', 'пойш') ), 'BGN': ( ('лев', 'леви', 'левів'), ('стотинка', 'стотинки', 'стотинок') ), 'BHD': ( ('динар', 'динари', 'динарів'), ('філс', 'філси', 'філсів') ), 'BIF': ( ('франк', 'франки', 'франків'), ('сантим', 'сантими', 'сантимів') ), 'BMD': (GENERIC_DOLLARS, GENERIC_CENTS), 'BND': (GENERIC_DOLLARS, GENERIC_CENTS), 'BOB': ( ('болівіано', 'болівіано', 'болівіано'), ('сентаво', 'сентаво', 'сентаво') ), 'BRL': ( ('реал', 'реали', 'реалів'), ('сентаво', 'сентаво', 'сентаво') ), 'BSD': (GENERIC_DOLLARS, GENERIC_CENTS), 'BTN': ( ('нгултрум', 'нгултруми', 'нгултрумів'), ('четрум', 'четруми', 'четрумів') ), 'BWP': ( ('пула', 'пули', 'пул'), ('тхебе', 'тхебе', 'тхебе') ), 'BYN': ( ('рубель', 'рублі', 'рублів'), ('копійка', 'копійки', 'копійок') ), 'BZD': (GENERIC_DOLLARS, GENERIC_CENTS), 'CAD': (GENERIC_DOLLARS, GENERIC_CENTS), 'CDF': ( ('франк', 'франки', 'франків'), ('сантим', 'сантими', 'сантимів') ), 'CHF': ( ('франк', 'франки', 'франків'), ('сантим', 'сантими', 'сантимів') ), 'CLP': ( ('песо', 'песо', 'песо'), ('сентаво', 'сентаво', 'сентаво') ), 'CNY': ( ('юань', 'юані', 'юанів'), ('финь', 'фині', 'финів') ), 'COP': ( ('песо', 'песо', 'песо'), ('сентаво', 'сентаво', 'сентаво') ), 'CRC': ( ('колон', 'колони', 'колонів'), ('сентімо', 'сентімо', 'сентімо') ), 'CUC': ( ('песо', 'песо', 'песо'), ('сентаво', 'сентаво', 'сентаво') ), 'CUP': ( ('песо', 'песо', 'песо'), ('сентаво', 'сентаво', 'сентаво') ), 'CVE': ( ('ескудо', 'ескудо', 'ескудо'), ('сентаво', 'сентаво', 'сентаво') ), 'CZK': ( ('крона', 'крони', 'крон'), ('гелер', 'гелери', 'гелерів') ), 'DJF': ( ('франк', 'франки', 'франків'), ('сантим', 'сантими', 'сантимів') ), 'DKK': ( ('крона', 'крони', 'крон'), ('ере', 'ере', 'ере') ), 'DOP': ( ('песо', 'песо', 'песо'), ('сентаво', 'сентаво', 'сентаво') ), 'DZD': ( ('динар', 'динари', 'динарів'), ('сантим', 'сантими', 'сантимів') ), 'EGP': ( ('фунт', 'фунти', 'фунтів'), ('піастр', 'піастри', 'піастрів') ), 'ERN': ( ('накфа', 'накфи', 'накф'), GENERIC_CENTS ), 'ETB': ( ('бир', 'бири', 'бирів'), GENERIC_CENTS ), 'EUR': ( ('євро', 'євро', 'євро'), GENERIC_CENTS ), 'FJD': (GENERIC_DOLLARS, GENERIC_CENTS), 'FKP': ( ('фунт', 'фунти', 'фунтів'), ('пенс', 'пенси', 'пенсів') ), 'GBP': ( ('фунт', 'фунти', 'фунтів'), ('пенс', 'пенси', 'пенсів') ), 'GEL': ( ('ларі', 'ларі', 'ларі'), ('тетрі', 'тетрі', 'тетрі') ), 'GHS': ( ('седі', 'седі', 'седі'), ('песева', 'песеви', 'песев') ), 'GIP': ( ('фунт', 'фунти', 'фунтів'), ('пенс', 'пенси', 'пенсів') ), 'GMD': ( ('даласі', 'даласі', 'даласі'), ('бутут', 'бутути', 'бутутів') ), 'GNF': ( ('франк', 'франки', 'франків'), ('сантим', 'сантими', 'сантимів') ), 'GTQ': ( ('кетсаль', 'кетсалі', 'кетсалів'), ('сентаво', 'сентаво', 'сентаво') ), 'GYD': (GENERIC_DOLLARS, GENERIC_CENTS), 'HKD': (GENERIC_DOLLARS, GENERIC_CENTS), 'HNL': ( ('лемпіра', 'лемпіри', 'лемпір'), ('сентаво', 'сентаво', 'сентаво') ), 'HRK': ( ('куна', 'куни', 'кун'), ('ліпа', 'ліпи', 'ліп') ), 'HTG': ( ('гурд', 'гурди', 'гурдів'), ('сантим', 'сантими', 'сантимів') ), 'HUF': ( ('форинт', 'форинти', 'форинтів'), ('філлер', 'філлери', 'філлерів') ), 'IDR': ( ('рупія', 'рупії', 'рупій'), GENERIC_CENTS ), 'ILS': ( ('шекель', 'шекелі', 'шекелів'), ('агора', 'агори', 'агор') ), 'INR': ( ('рупія', 'рупії', 'рупій'), ('пайса', 'пайси', 'пайс') ), 'IQD': ( ('динар', 'динари', 'динарів'), ('філс', 'філси', 'філсів') ), 'IRR': ( ('ріал', 'ріали', 'ріалів'), ('динар', 'динари', 'динарів') ), 'ISK': ( ('крона', 'крони', 'крон'), ('ейре', 'ейре', 'ейре') ), 'JMD': (GENERIC_DOLLARS, GENERIC_CENTS), 'JOD': ( ('динар', 'динари', 'динарів'), ('філс', 'філси', 'філсів') ), 'JPY': ( ('єна', 'єни', 'єн'), ('сен', 'сен', 'сен') ), 'KES': ( ('шилінг', 'шилінги', 'шилінгів'), GENERIC_CENTS ), 'KGS': ( ('сом', 'соми', 'сомів'), ('тиїн', 'тиїни', 'тиїнів') ), 'KHR': ( ('рієль', 'рієлі', 'рієлів'), ('су', 'су', 'су') ), 'KMF': ( ('франк', 'франки', 'франків'), ('сантим', 'сантими', 'сантимів') ), 'KPW': ( ('вона', 'вони', 'вон'), ('чон', 'чони', 'чонів') ), 'KRW': ( ('вона', 'вони', 'вон'), ('джеон', 'джеони', 'джеонів') ), 'KWD': ( ('динар', 'динари', 'динарів'), ('філс', 'філси', 'філсів') ), 'KYD': (GENERIC_DOLLARS, GENERIC_CENTS), 'KZT': ( ('теньге', 'теньге', 'теньге'), ('тиїн', 'тиїни', 'тиїнів')), 'LAK': ( ('кіп', 'кіпи', 'кіпів'), ('ат', 'ати', 'атів') ), 'LBP': ( ('фунт', 'фунти', 'фунтів'), ('піастр', 'піастри', 'піастрів') ), 'LKR': ( ('рупія', 'рупії', 'рупій'), GENERIC_CENTS ), 'LRD': (GENERIC_DOLLARS, GENERIC_CENTS), 'LSL': ( ('лоті', 'малоті', 'малоті'), ('сенте', 'лісенте', 'лісенте') ), 'LYD': ( ('динар', 'динари', 'динарів'), ('дирхам', 'дирхами', 'дирхамів') ), 'MAD': ( ('дирхам', 'дирхами', 'дирхамів'), ('сантим', 'сантими', 'сантимів') ), 'MDL': ( ('лей', 'леї', 'леї'), ('бан', 'бані', 'бані') ), 'MGA': ( ('аріарі', 'аріарі', 'аріарі'), ('іраймбіланья', 'іраймбіланья', 'іраймбіланья') ), 'MKD': ( ('денар', 'денари', 'денарів'), ('дені', 'дені', 'дені') ), 'MMK': ( ('к\'ят', 'к\'ят', 'к\'ят'), ('п\'я', 'п\'я', 'п\'я') ), 'MNT': ( ('тугрик', 'тугрики', 'тугриків'), ('мунгу', 'мунгу', 'мунгу') ), 'MOP': ( ('патака', 'патакі', 'патак'), ('аво', 'аво', 'аво') ), 'MRU': ( ('угія', 'угії', 'угій'), ('хумс', 'хумс', 'хумс') ), 'MUR': ( ('рупія', 'рупії', 'рупій'), GENERIC_CENTS ), 'MVR': ( ('руфія', 'руфії', 'руфій'), ('ларі', 'ларі', 'ларі') ), 'MWK': ( ('квача', 'квачі', 'квач'), ('тамбала', 'тамбала', 'тамбала') ), 'MXN': ( ('песо', 'песо', 'песо'), ('сентаво', 'сентаво', 'сентаво') ), 'MYR': ( ('рингіт', 'рингіти', 'рингітів'), GENERIC_CENTS ), 'MZN': ( ('метікал', 'метікали', 'метікалів'), ('сентаво', 'сентаво', 'сентаво') ), 'NAD': (GENERIC_DOLLARS, GENERIC_CENTS), 'NGN': ( ('найра', 'найри', 'найр'), ('кобо', 'кобо', 'кобо') ), 'NIO': ( ('кордоба', 'кордоби', 'кордоб'), ('сентаво', 'сентаво', 'сентаво') ), 'NOK': ( ('крона', 'крони', 'крон'), ('ере', 'ере', 'ере') ), 'NPR': ( ('рупія', 'рупії', 'рупій'), ('пайса', 'пайси', 'пайс') ), 'NZD': (GENERIC_DOLLARS, GENERIC_CENTS), 'OMR': ( ('ріал', 'ріали', 'ріалів'), ('байза', 'байзи', 'байз') ), 'PAB': ( ('бальбоа', 'бальбоа', 'бальбоа'), ('сентесімо', 'сентесімо', 'сентесімо') ), 'PEN': ( ('соль', 'соль', 'соль'), ('сентімо', 'сентімо', 'сентімо') ), 'PGK': ( ('кіна', 'кіна', 'кіна'), ('тойя', 'тойя', 'тойя') ), 'PHP': ( ('песо', 'песо', 'песо'), ('сентаво', 'сентаво', 'сентаво') ), 'PKR': ( ('рупія', 'рупії', 'рупій'), ('пайса', 'пайси', 'пайс') ), 'PLN': ( ('злотий', 'злоті', 'злотих'), ('грош', 'гроші', 'грошів') ), 'PYG': ( ('гуарані', 'гуарані', 'гуарані'), ('сентімо', 'сентімо', 'сентімо') ), 'QAR': ( ('ріал', 'ріали', 'ріалів'), ('дирхам', 'дирхами', 'дирхамів') ), 'RON': ( ('лей', 'леї', 'леї'), ('бан', 'бані', 'бані') ), 'RSD': ( ('динар', 'динари', 'динарів'), ('пара', 'пари', 'пар') ), 'RUB': ( ('рубль', 'рублі', 'рублів'), ('копійка', 'копійки', 'копійок') ), 'RWF': ( ('франк', 'франки', 'франків'), ('сантим', 'сантими', 'сантимів') ), 'SAR': ( ('ріал', 'ріали', 'ріалів'), ('халал', 'халали', 'халалів') ), 'SBD': (GENERIC_DOLLARS, GENERIC_CENTS), 'SCR': ( ('рупія', 'рупії', 'рупій'), GENERIC_CENTS ), 'SDG': ( ('фунт', 'фунти', 'фунтів'), ('піастр', 'піастри', 'піастрів') ), 'SEK': ( ('крона', 'крони', 'крон'), ('ере', 'ере', 'ере') ), 'SGD': (GENERIC_DOLLARS, GENERIC_CENTS), 'SHP': ( ('фунт', 'фунти', 'фунтів'), ('пенс', 'пенси', 'пенсів') ), 'SLL': ( ('леоне', 'леоне', 'леоне'), GENERIC_CENTS ), 'SOS': ( ('шилінг', 'шилінги', 'шилінгів'), GENERIC_CENTS ), 'SRD': (GENERIC_DOLLARS, GENERIC_CENTS), 'SSP': ( ('фунт', 'фунти', 'фунтів'), ('піастр', 'піастри', 'піастрів') ), 'STN': ( ('добра', 'добри', 'добр'), ('сентімо', 'сентімо', 'сентімо') ), 'SYP': ( ('фунт', 'фунти', 'фунтів'), ('піастр', 'піастри', 'піастрів') ), 'SZL': ( ('ліланґені', 'ліланґені', 'ліланґені'), GENERIC_CENTS ), 'THB': ( ('бат', 'бати', 'батів'), ('сатанг', 'сатанги', 'сатангів') ), 'TJS': ( ('сомоні', 'сомоні', 'сомоні'), ('дірам', 'дірами', 'дірамів') ), 'TMT': ( ('манат', 'манати', 'манатів'), ('тенге', 'тенге', 'тенге') ), 'TND': ( ('динар', 'динари', 'динарів'), ('міллім', 'мілліми', 'міллімів') ), 'TOP': ( ('паанга', 'паанга', 'паанга'), ('сеніті', 'сеніті', 'сеніті') ), 'TRY': ( ('ліра', 'ліри', 'лір'), ('куруш', 'куруші', 'курушів') ), 'TTD': (GENERIC_DOLLARS, GENERIC_CENTS), 'TWD': ( ('новий долар', 'нові долари', 'нових доларів'), GENERIC_CENTS ), 'TZS': ( ('шилінг', 'шилінги', 'шилінгів'), GENERIC_CENTS ), 'UAH': ( ('гривня', 'гривні', 'гривень'), ('копійка', 'копійки', 'копійок') ), 'UGX': ( ('шилінг', 'шилінги', 'шилінгів'), GENERIC_CENTS ), 'USD': (GENERIC_DOLLARS, GENERIC_CENTS), 'UYU': ( ('песо', 'песо', 'песо'), ('сентесімо', 'сентесімо', 'сентесімо') ), 'UZS': ( ('сум', 'суми', 'сумів'), ('тиїн', 'тиїни', 'тиїнів') ), 'VND': ( ('донг', 'донги', 'донгів'), ('су', 'су', 'су') ), 'WST': ( ('тала', 'тали', 'тал'), ('сене', 'сене', 'сене') ), 'XCD': (GENERIC_DOLLARS, GENERIC_CENTS), 'YER': ( ('ріал', 'ріали', 'ріалів'), ('філс', 'філси', 'філсів') ), 'ZAR': ( ('ранд', 'ранди', 'рандів'), GENERIC_CENTS ), 'ZMW': ( ('квача', 'квачі', 'квач'), ('нгве', 'нгве', 'нгве') ), } def setup(self): self.negword = "мінус" self.pointword = "кома" def to_cardinal(self, number, **kwargs): if 'case' in kwargs: case = kwargs['case'] morphological_case = [ "nominative", "genitive", "dative", "accusative", "instrumental", "locative"].index(case) else: morphological_case = 0 if 'gender' in kwargs: gender = kwargs['gender'] == 'feminine' else: gender = False n = str(number).replace(',', '.') if '.' in n: left, right = n.split('.') leading_zero_count = len(right) - len(right.lstrip('0')) right_side = self._int2word(int(right), gender, morphological_case) decimal_part = ((ZERO[0] + ' ') * leading_zero_count + right_side) return u'%s %s %s' % ( self._int2word(int(left), gender, morphological_case), self.pointword, decimal_part ) else: return self._int2word(int(n), gender, morphological_case) def pluralize(self, n, forms): if n % 100 < 10 or n % 100 > 20: if n % 10 == 1: form = 0 elif 5 > n % 10 > 1: form = 1 else: form = 2 else: form = 2 return forms[form] def _int2word(self, n, feminine=False, morphological_case=0): if n < 0: n_value = self._int2word(abs(n), feminine, morphological_case) return ' '.join([self.negword, n_value]) if n == 0: return ZERO[0] words = [] chunks = list(splitbyx(str(n), 3)) i = len(chunks) for x in chunks: i -= 1 if x == 0: continue n1, n2, n3 = get_digits(x) if n3 > 0: words.append(HUNDREDS[n3][morphological_case]) if n2 > 1: words.append(TWENTIES[n2][morphological_case]) if n2 == 1: words.append(TENS[n1][morphological_case]) # elif n1 > 0 and not (i > 0 and x == 1): elif n1 > 0: ones = ONES_FEMININE if i == 1 or feminine and i == 0 else ONES words.append(ones[n1][morphological_case]) if i > 0: thousands_val = THOUSANDS[i][morphological_case] words.append(self.pluralize(x, thousands_val)) return ' '.join(words) def _money_verbose(self, number, currency): return self._int2word(number, currency in FEMININE_MONEY) def _cents_verbose(self, number, currency): return self._int2word(number, currency in FEMININE_CENTS) @staticmethod def last_fragment_to_ordinal(last, words, level): n1, n2, n3 = get_digits(last) last_two = n2*10+n1 if last_two == 0: words.append(HUNDREDS_ORDINALS[n3][level]) elif level == 1 and last == 1: return elif last_two < 20: if level == 0: if n3 > 0: words.append(HUNDREDS[n3][0]) words.append(ONES_ORDINALS[last_two][0]) else: last_fragment_string = '' if n3 > 0: last_fragment_string += HUNDREDS_ORDINALS[n3][1] last_fragment_string += ONES_ORDINALS[last_two][1] words.append(last_fragment_string) elif last_two % 10 == 0: if level == 0: if n3 > 0: words.append(HUNDREDS[n3][0]) words.append(TWENTIES_ORDINALS[n2][0]) else: last_fragment_string = '' if n3 > 0: last_fragment_string += HUNDREDS_ORDINALS[n3][1] last_fragment_string += TWENTIES_ORDINALS[n2][1] words.append(last_fragment_string) else: if level == 0: if n3 > 0: words.append(HUNDREDS[n3][0]) words.append(TWENTIES[n2][0]) words.append(ONES_ORDINALS[n1][0]) else: last_fragment_string = '' if n3 > 0: last_fragment_string += HUNDREDS_ORDINALS[n3][1] last_fragment_string += TWENTIES_ORDINALS[n2][1] last_fragment_string += ONES_ORDINALS[n1][1] words.append(last_fragment_string) def to_ordinal(self, number): self.verify_ordinal(number) words = [] fragments = list(splitbyx(str(number), 3)) level = 0 last = fragments[-1] while last == 0: level = level + 1 fragments.pop() last = fragments[-1] if len(fragments) > 1: pre_part = self._int2word(number - (last * 1000 ** level)) words.append(pre_part) Num2Word_UK.last_fragment_to_ordinal( last, words, 0 if level == 0 else 1 ) output = " ".join(words) if last == 1 and level > 0 and output != "": output = output + " " if level > 0: output = output + prefixes_ordinal[level] return output