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
| # -*- coding: utf-8 -*-
|
|
| from __future__ import print_function, unicode_literals
|
| from .base import Num2Word_Base
| from .utils import get_digits, splitbyx
|
| ZERO = (u'אפס',)
|
| ONES = {
| 1: (u'אחת',),
| 2: (u'שתים',),
| 3: (u'שלש',),
| 4: (u'ארבע',),
| 5: (u'חמש',),
| 6: (u'שש',),
| 7: (u'שבע',),
| 8: (u'שמונה',),
| 9: (u'תשע',),
| }
|
| TENS = {
| 0: (u'עשר',),
| 1: (u'אחת עשרה',),
| 2: (u'שתים עשרה',),
| 3: (u'שלש עשרה',),
| 4: (u'ארבע עשרה',),
| 5: (u'חמש עשרה',),
| 6: (u'שש עשרה',),
| 7: (u'שבע עשרה',),
| 8: (u'שמונה עשרה',),
| 9: (u'תשע עשרה',),
| }
|
| TWENTIES = {
| 2: (u'עשרים',),
| 3: (u'שלשים',),
| 4: (u'ארבעים',),
| 5: (u'חמישים',),
| 6: (u'ששים',),
| 7: (u'שבעים',),
| 8: (u'שמונים',),
| 9: (u'תשעים',),
| }
|
| HUNDRED = {
| 1: (u'מאה',),
| 2: (u'מאתיים',),
| 3: (u'מאות',)
| }
|
| THOUSANDS = {
| 1: (u'אלף',),
| 2: (u'אלפיים',),
| 3: (u'שלשת אלפים',),
| 4: (u'ארבעת אלפים',),
| 5: (u'חמשת אלפים',),
| 6: (u'ששת אלפים',),
| 7: (u'שבעת אלפים',),
| 8: (u'שמונת אלפים',),
| 9: (u'תשעת אלפים',),
| }
|
| AND = u'ו'
|
|
| def pluralize(n, forms):
| # gettext implementation:
| # (n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2)
|
| form = 0 if (n % 10 == 1 and n % 100 != 11) else 1 if n != 0 else 2
|
| return forms[form]
|
|
| def int2word(n):
| if n > 9999: # doesn't yet work for numbers this big
| raise NotImplementedError()
|
| 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 i > 0:
| words.append(THOUSANDS[n1][0])
| continue
|
| if n3 > 0:
| if n3 <= 2:
| words.append(HUNDRED[n3][0])
| else:
| words.append(ONES[n3][0] + ' ' + HUNDRED[3][0])
|
| if n2 > 1:
| words.append(TWENTIES[n2][0])
|
| if n2 == 1:
| words.append(TENS[n1][0])
| elif n1 > 0 and not (i > 0 and x == 1):
| words.append(ONES[n1][0])
|
| if i > 0:
| words.append(THOUSANDS[i][0])
|
| # source: https://hebrew-academy.org.il/2017/01/30/ו-החיבור-במספרים/
| if len(words) > 1:
| words[-1] = AND + words[-1]
|
| return ' '.join(words)
|
|
| def n2w(n):
| return int2word(int(n))
|
|
| def to_currency(n, currency='EUR', cents=True, separator=','):
| raise NotImplementedError()
|
|
| class Num2Word_HE(Num2Word_Base):
| def to_cardinal(self, number):
| return n2w(number)
|
| def to_ordinal(self, number):
| raise NotImplementedError()
|
|
| if __name__ == '__main__':
| yo = Num2Word_HE()
| nums = [1, 11, 21, 24, 99, 100, 101, 200, 211, 345, 1000, 1011]
| for num in nums:
| print(num, yo.to_cardinal(num))
|
|