150 lines
5.0 KiB
Python
150 lines
5.0 KiB
Python
# -*- 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 division, print_function, unicode_literals
|
||
|
||
from . import lang_EU
|
||
|
||
GENERIC_DOLLARS = ("доллар", "доллар")
|
||
GENERIC_CENTS = ("сент", "сент")
|
||
|
||
|
||
class Num2Word_TG(lang_EU.Num2Word_EU):
|
||
CURRENCY_FORMS = {
|
||
# repalced by EUR
|
||
"EUR": (("евро", "евро"), GENERIC_CENTS),
|
||
# replaced by EUR
|
||
"USD": (GENERIC_DOLLARS, GENERIC_CENTS),
|
||
"RUB": (("рубл", "рубл"), ("копейк", "копейк")),
|
||
"TJS": (("сомонӣ", "сомонӣ"), ("дирам", "дирам")),
|
||
}
|
||
|
||
GIGA_SUFFIX = "иллиард"
|
||
MEGA_SUFFIX = "иллион"
|
||
|
||
def set_high_numwords(self, high):
|
||
cap = 3 * (len(high) + 1)
|
||
|
||
for word, n in zip(high, range(cap, 5, -3)):
|
||
if n == 9:
|
||
self.cards[10 ** n] = word + self.GIGA_SUFFIX
|
||
|
||
else:
|
||
self.cards[10 ** n] = word + self.MEGA_SUFFIX
|
||
|
||
def setup(self):
|
||
super(Num2Word_TG, self).setup()
|
||
|
||
lows = ["квинт", "квадр", "тр", "м", "м"]
|
||
self.high_numwords = self.gen_high_numwords([], [], lows)
|
||
self.negword = "минус "
|
||
self.pointword = "нуқта"
|
||
self.exclude_title = ["ва", "минус", "нуқта"]
|
||
|
||
self.mid_numwords = [
|
||
(1000, "ҳазор"),
|
||
(100, "сад"),
|
||
(90, "навад"),
|
||
(80, "ҳаштод"),
|
||
(70, "ҳафтод"),
|
||
(60, "шаст"),
|
||
(50, "панҷоҳ"),
|
||
(40, "чил"),
|
||
(30, "си"),
|
||
]
|
||
self.low_numwords = [
|
||
"бист",
|
||
"нуздаҳ",
|
||
"ҳаждаҳ",
|
||
"ҳабдаҳ",
|
||
"шонздаҳ",
|
||
"понздаҳ",
|
||
"чордаҳ",
|
||
"сенздаҳ",
|
||
"дувоздаҳ",
|
||
"ёздаҳ",
|
||
"даҳ",
|
||
"нӯҳ",
|
||
"ҳашт",
|
||
"ҳафт",
|
||
"шаш",
|
||
"панҷ",
|
||
"чор",
|
||
"се",
|
||
"ду",
|
||
"як",
|
||
"сифр",
|
||
]
|
||
|
||
def to_cardinal(self, value):
|
||
try:
|
||
assert int(value) == value
|
||
except (ValueError, TypeError, AssertionError):
|
||
return self.to_cardinal_float(value)
|
||
|
||
out = ""
|
||
if value < 0:
|
||
value = abs(value)
|
||
out = self.negword
|
||
|
||
if value >= self.MAXVAL:
|
||
raise OverflowError(self.errmsg_toobig % (value, self.MAXVAL))
|
||
|
||
if value == 100:
|
||
return self.title(out + "сад")
|
||
else:
|
||
val = self.splitnum(value)
|
||
words, num = self.clean(val)
|
||
return self.title(out + words)
|
||
|
||
def merge(self, lpair, rpair):
|
||
ltext, lnum = lpair
|
||
rtext, rnum = rpair
|
||
if lnum == 1 and rnum < 100:
|
||
return (rtext, rnum)
|
||
elif 100 > lnum > rnum:
|
||
if ltext == "си":
|
||
return ("%sю %s" % (ltext, rtext), lnum + rnum)
|
||
elif ltext == "панҷоҳ":
|
||
return ("панҷову %s" % (rtext), lnum + rnum)
|
||
else:
|
||
return ("%sу %s" % (ltext, rtext), lnum + rnum)
|
||
elif lnum >= 100 > rnum:
|
||
return ("%sу %s" % (ltext, rtext), lnum + rnum)
|
||
elif rnum > lnum:
|
||
if ltext == "яксад" and rtext not in self.low_numwords:
|
||
return ("сад %s" % (rtext), lnum * rnum)
|
||
if rtext == "сад":
|
||
return ("%s%s" % (ltext, rtext), lnum * rnum)
|
||
else:
|
||
return ("%s %s" % (ltext, rtext), lnum * rnum)
|
||
return ("%sу %s" % (ltext, rtext), lnum + rnum)
|
||
|
||
def to_ordinal(self, value):
|
||
self.verify_ordinal(value)
|
||
cardinal = self.to_cardinal(value)
|
||
outwords = cardinal.split(" ")
|
||
lastword = outwords[-1]
|
||
if lastword in ["ду", "се", "си"]:
|
||
return "%sюм" % (cardinal)
|
||
else:
|
||
return "%sум" % (cardinal)
|
||
|
||
def to_ordinal_num(self, value):
|
||
self.verify_ordinal(value)
|
||
return "%s%s" % (value, self.to_ordinal(value)[-2:])
|