File: lang_TG.py

package info (click to toggle)
python-num2words 0.5.14-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,832 kB
  • sloc: python: 27,073; makefile: 3
file content (149 lines) | stat: -rw-r--r-- 5,076 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# -*- 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:])